谁说编译器不SB

我有这么一段代码,我使用的是VS2010IDE,直接编译Release模式,开O2,谁能猜到编译器怎么给我编的

  1 typedef HRESULT (__stdcall *FTSHGetFolderLocation)(HWND hwndOwner,
  2     int nFolder,
  3     HANDLE hToken,
  4     DWORD dwReserved,
  5     void *ppidl
  6     );
  7 typedef HRESULT (__stdcall *FTSHGetFolderPathW)(
  8     _In_  HWND   hwndOwner,
  9     _In_  int    nFolder,
 10     _In_  HANDLE hToken,
 11     _In_  DWORD  dwFlags,
 12     _Out_ LPTSTR pszPath
 13     );
 14 typedef BOOL (__stdcall *FTSHGetPathFromIDListW)(
 15     _In_  void *pidl,
 16     _Out_ LPTSTR            pszPath
 17     );
 18 typedef void (__stdcall *FTILFree)(
 19     _In_ VOID *pidl
 20     );
 21 typedef BOOL (WINAPI *FTGetFileAttributesExW)(
 22     __in LPCWSTR lpFileName,
 23     __in GET_FILEEX_INFO_LEVELS fInfoLevelId,
 24     __out LPVOID lpFileInformation
 25     );
 26 typedef BOOL (WINAPI *FTCreateDirectoryA)(
 27     __in          LPCSTR lpPathName,
 28     __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes
 29     );
 30 typedef DWORD (WINAPI *FTGetTempPathA)(
 31     _In_  DWORD  nBufferLength,
 32     _Out_ LPSTR lpBuffer
 33     );
 34 
 35 typedef WINADVAPI LSTATUS (APIENTRY *FTRegOpenKeyExW) (
 36     __in HKEY hKey,
 37     __in_opt LPCWSTR lpSubKey,
 38     __reserved DWORD ulOptions,
 39     __in REGSAM samDesired,
 40     __out PHKEY phkResult
 41     );
 42 
 43 typedef WINADVAPI
 44     LSTATUS
 45     (APIENTRY *FTRegQueryValueExW)(
 46     __in HKEY hKey,
 47     __in_opt LPCWSTR lpValueName,
 48     __reserved LPDWORD lpReserved,
 49     __out_opt LPDWORD lpType,
 50     __out_bcount_part_opt(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPBYTE lpData,
 51     __inout_opt LPDWORD lpcbData
 52     );
 53 
 54 typedef WINADVAPI
 55     LSTATUS
 56     (APIENTRY *FTRegCloseKey)(
 57     __in HKEY hKey
 58     );
 59 
 60 typedef HRESULT (__stdcall* FTCoInitialize)(
 61     _In_opt_ LPVOID pvReserved
 62     );
 63 
 64 typedef HRESULT (__stdcall* FTCoCreateInstance)(
 65     __in     REFCLSID rclsid, 
 66     __in_opt LPUNKNOWN pUnkOuter,
 67     __in     DWORD dwClsContext, 
 68     __in     REFIID riid, 
 69     __deref_out LPVOID FAR* ppv);
 70 
 71 typedef void (__stdcall* FTCoUninitialize)(void);
 72 
 73 typedef BOOL (__stdcall* FTPathRemoveFileSpecW)(
 74     __inout LPWSTR pszPath
 75     );
 76 
 77 typedef BOOL (WINAPI* FTDeleteFileW)(
 78     _In_ LPCWSTR lpFileName
 79     );
 80 
 81 
 82 #define START_FUNC_ARRAY()                    
 83 struct FunctionArray                        
 84 {                                            
 85     long                size
 86 #define ADD_FUN_ARRAY(_M_, _N_)                
 87     FT ## _N_            p ## _N_
 88 #define END_FUNC_ARRAY()                    
 89 }
 90 
 91 
 92 #define GET_MODE_PROC_ADDRESS(_M_, _F_, _T_, _V_)                
 93     do                                                            
 94     {                                                            
 95         _V_ = (_T_)GetProcAddress(::LoadLibraryA(_M_), _F_);    
 96         if (_V_ == NULL)                                        
 97         {                                                        
 98             ErrorLog();                                            
 99             return FALSE;                                        
100         }                                                        
101     } while (FALSE)
102 
103 #define GET_PROC_ADDRESS(__M_, __F_)    
104     GET_MODE_PROC_ADDRESS(__M_, #__F_, FT ## __F_, g_funArray.p ## __F_)
105 
106 #define CALL(_F_)    
107     g_funArray.p ## _F_
108 
109 
110 
111 START_FUNC_ARRAY();
112     ADD_FUN_ARRAY("shell32.dll", SHGetFolderLocation);
113     ADD_FUN_ARRAY("shell32.dll", SHGetFolderPathW);
114     ADD_FUN_ARRAY("shell32.dll", SHGetPathFromIDListW);
115     ADD_FUN_ARRAY("shell32.dll", ILFree);
116 
117     ADD_FUN_ARRAY("Kernel32.dll", GetFileAttributesExW);
118     ADD_FUN_ARRAY("Kernel32.dll", CreateDirectoryA);
119     ADD_FUN_ARRAY("Kernel32.dll", GetTempPathA);
120     ADD_FUN_ARRAY("Kernel32.dll", DeleteFileW);
121 
122     ADD_FUN_ARRAY("Advapi32.dll", RegOpenKeyExW);
123     ADD_FUN_ARRAY("Advapi32.dll", RegQueryValueExW);
124     ADD_FUN_ARRAY("Advapi32.dll", RegCloseKey);
125 
126     ADD_FUN_ARRAY("Ole32.dll", CoInitialize);
127     ADD_FUN_ARRAY("Ole32.dll", CoCreateInstance);
128     ADD_FUN_ARRAY("Ole32.dll", CoUninitialize);
129 
130     ADD_FUN_ARRAY("Shlwapi.dll", PathRemoveFileSpecW);
131 END_FUNC_ARRAY();
132 
133 
134 
135 FunctionArray g_funArray = {sizeof(FunctionArray)};
136 
137 BOOL InitFunction()
138 {
139     GET_PROC_ADDRESS("shell32.dll"        , SHGetFolderLocation);
140     GET_PROC_ADDRESS("shell32.dll"        , SHGetFolderPathW);
141     GET_PROC_ADDRESS("shell32.dll"        , SHGetPathFromIDListW);
142     GET_PROC_ADDRESS("shell32.dll"        , ILFree);
143 
144     GET_PROC_ADDRESS("Kernel32.dll"        , GetFileAttributesExW);
145     GET_PROC_ADDRESS("Kernel32.dll"        , CreateDirectoryA);
146     GET_PROC_ADDRESS("Kernel32.dll"        , GetTempPathA);
147     GET_PROC_ADDRESS("Kernel32.dll"        , DeleteFileW);
148 
149     GET_PROC_ADDRESS("Advapi32.dll"        , RegOpenKeyExW);
150     GET_PROC_ADDRESS("Advapi32.dll"        , RegQueryValueExW);
151     GET_PROC_ADDRESS("Advapi32.dll"        , RegCloseKey);
152 
153     GET_PROC_ADDRESS("Ole32.dll"        , CoInitialize);
154     GET_PROC_ADDRESS("Ole32.dll"        , CoCreateInstance);
155     GET_PROC_ADDRESS("Ole32.dll"        , CoUninitialize);
156 
157     GET_PROC_ADDRESS("Shlwapi.dll"        , PathRemoveFileSpecW);
158     return TRUE;
159 }

先猜猜看,猜不到的往下看

  1 ; __int64 Initialize(void)
  2 ?Initialize@@YAHXZ proc near            ; CODE XREF: DllMain+51p
  3                                         ; DATA XREF: .pdata:000000018000E060o
  4                 sub     rsp, 28h
  5                 lea     rcx, LibFileName ; "shell32.dll"
  6                 call    cs:LoadLibraryA
  7                 lea     rdx, ProcName   ; "SHGetFolderLocation"
  8                 mov     rcx, rax        ; hModule
  9                 call    cs:GetProcAddress
 10                 mov     cs:qword_18000CED0, rax
 11                 test    rax, rax
 12                 jnz     short loc_180002154
 13 
 14 loc_18000214D:                          ; CODE XREF: Initialize(void)+5Bj
 15                                         ; Initialize(void)+84j ...
 16                 xor     eax, eax
 17                 add     rsp, 28h
 18                 retn
 19 ; ---------------------------------------------------------------------------
 20 
 21 loc_180002154:                          ; CODE XREF: Initialize(void)+2Bj
 22                 lea     rcx, LibFileName ; "shell32.dll"
 23                 call    cs:LoadLibraryA
 24                 lea     rdx, aShgetfolderpat ; "SHGetFolderPathW"
 25                 mov     rcx, rax        ; hModule
 26                 call    cs:GetProcAddress
 27                 mov     cs:qword_18000CED8, rax
 28                 test    rax, rax
 29                 jz      short loc_18000214D
 30                 lea     rcx, LibFileName ; "shell32.dll"
 31                 call    cs:LoadLibraryA
 32                 lea     rdx, aShgetpathfromi ; "SHGetPathFromIDListW"
 33                 mov     rcx, rax        ; hModule
 34                 call    cs:GetProcAddress
 35                 mov     cs:qword_18000CEE0, rax
 36                 test    rax, rax
 37                 jz      short loc_18000214D
 38                 lea     rcx, LibFileName ; "shell32.dll"
 39                 call    cs:LoadLibraryA
 40                 lea     rdx, aIlfree    ; "ILFree"
 41                 mov     rcx, rax        ; hModule
 42                 call    cs:GetProcAddress
 43                 mov     cs:qword_18000CEE8, rax
 44                 test    rax, rax
 45                 jz      loc_18000214D
 46                 lea     rcx, aKernel32_dll_0 ; "Kernel32.dll"
 47                 call    cs:LoadLibraryA
 48                 lea     rdx, aGetfileattribu ; "GetFileAttributesExW"
 49                 mov     rcx, rax        ; hModule
 50                 call    cs:GetProcAddress
 51                 mov     cs:qword_18000CEF0, rax
 52                 test    rax, rax
 53                 jz      loc_18000214D
 54                 lea     rcx, aKernel32_dll_0 ; "Kernel32.dll"
 55                 call    cs:LoadLibraryA
 56                 lea     rdx, aCreatedirector ; "CreateDirectoryA"
 57                 mov     rcx, rax        ; hModule
 58                 call    cs:GetProcAddress
 59                 mov     cs:qword_18000CEF8, rax
 60                 test    rax, rax
 61                 jz      loc_18000214D
 62                 lea     rcx, aKernel32_dll_0 ; "Kernel32.dll"
 63                 call    cs:LoadLibraryA
 64                 lea     rdx, aGettemppatha ; "GetTempPathA"
 65                 mov     rcx, rax        ; hModule
 66                 call    cs:GetProcAddress
 67                 mov     cs:qword_18000CF00, rax
 68                 test    rax, rax
 69                 jz      loc_18000214D
 70                 lea     rcx, aKernel32_dll_0 ; "Kernel32.dll"
 71                 call    cs:LoadLibraryA
 72                 lea     rdx, aDeletefilew ; "DeleteFileW"
 73                 mov     rcx, rax        ; hModule
 74                 call    cs:GetProcAddress
 75                 mov     cs:qword_18000CF40, rax
 76                 test    rax, rax
 77                 jz      loc_18000214D
 78                 lea     rcx, aAdvapi32_dll ; "Advapi32.dll"
 79                 call    cs:LoadLibraryA
 80                 lea     rdx, aRegopenkeyexw ; "RegOpenKeyExW"
 81                 mov     rcx, rax        ; hModule
 82                 call    cs:GetProcAddress
 83                 mov     cs:qword_18000CF08, rax
 84                 test    rax, rax
 85                 jz      loc_18000214D
 86                 lea     rcx, aAdvapi32_dll ; "Advapi32.dll"
 87                 call    cs:LoadLibraryA
 88                 lea     rdx, aRegqueryvaluee ; "RegQueryValueExW"
 89                 mov     rcx, rax        ; hModule
 90                 call    cs:GetProcAddress
 91                 mov     cs:qword_18000CF10, rax
 92                 test    rax, rax
 93                 jz      loc_18000214D
 94                 lea     rcx, aAdvapi32_dll ; "Advapi32.dll"
 95                 call    cs:LoadLibraryA
 96                 lea     rdx, aRegclosekey ; "RegCloseKey"
 97                 mov     rcx, rax        ; hModule
 98                 call    cs:GetProcAddress
 99                 mov     cs:qword_18000CF18, rax
100                 test    rax, rax
101                 jz      loc_18000214D
102                 lea     rcx, aOle32_dll ; "Ole32.dll"
103                 call    cs:LoadLibraryA
104                 lea     rdx, aCoinitialize ; "CoInitialize"
105                 mov     rcx, rax        ; hModule
106                 call    cs:GetProcAddress
107                 mov     cs:qword_18000CF20, rax
108                 test    rax, rax
109                 jz      loc_18000214D
110                 lea     rcx, aOle32_dll ; "Ole32.dll"
111                 call    cs:LoadLibraryA
112                 lea     rdx, aCocreateinstan ; "CoCreateInstance"
113                 mov     rcx, rax        ; hModule
114                 call    cs:GetProcAddress
115                 mov     cs:qword_18000CF28, rax
116                 test    rax, rax
117                 jz      loc_18000214D
118                 lea     rcx, aOle32_dll ; "Ole32.dll"
119                 call    cs:LoadLibraryA
120                 lea     rdx, aCouninitialize ; "CoUninitialize"
121                 mov     rcx, rax        ; hModule
122                 call    cs:GetProcAddress
123                 mov     cs:qword_18000CF30, rax
124                 test    rax, rax
125                 jz      loc_18000214D
126                 lea     rcx, aShlwapi_dll ; "Shlwapi.dll"
127                 call    cs:LoadLibraryA
128                 lea     rdx, aPathremovefile ; "PathRemoveFileSpecW"
129                 mov     rcx, rax        ; hModule
130                 call    cs:GetProcAddress
131                 xor     ecx, ecx
132                 test    rax, rax
133                 mov     cs:qword_18000CF38, rax
134                 setnz   cl
135                 mov     eax, ecx
136                 add     rsp, 28h
137                 retn
138 ?Initialize@@YAHXZ endp
139 
140 ; ---------------------------------------------------------------------------
View Code
原文地址:https://www.cnblogs.com/suanguade/p/7072141.html