谁说编译器不SB
我有这么一段代码,我使用的是VS2010IDE,直接编译Release模式,开O2,谁能猜到编译器怎么给我编的
typedef HRESULT (__stdcall *FTSHGetFolderLocation)(HWND hwndOwner,
int nFolder,
HANDLE hToken,
DWORD dwReserved,
void *ppidl
);
typedef HRESULT (__stdcall *FTSHGetFolderPathW)(
_In_ HWND hwndOwner,
_In_ int nFolder,
_In_ HANDLE hToken,
_In_ DWORD dwFlags,
_Out_ LPTSTR pszPath
);
typedef BOOL (__stdcall *FTSHGetPathFromIDListW)(
_In_ void *pidl,
_Out_ LPTSTR pszPath
);
typedef void (__stdcall *FTILFree)(
_In_ VOID *pidl
);
typedef BOOL (WINAPI *FTGetFileAttributesExW)(
__in LPCWSTR lpFileName,
__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
__out LPVOID lpFileInformation
);
typedef BOOL (WINAPI *FTCreateDirectoryA)(
__in LPCSTR lpPathName,
__in LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
typedef DWORD (WINAPI *FTGetTempPathA)(
_In_ DWORD nBufferLength,
_Out_ LPSTR lpBuffer
); typedef WINADVAPI LSTATUS (APIENTRY *FTRegOpenKeyExW) (
__in HKEY hKey,
__in_opt LPCWSTR lpSubKey,
__reserved DWORD ulOptions,
__in REGSAM samDesired,
__out PHKEY phkResult
); typedef WINADVAPI
LSTATUS
(APIENTRY *FTRegQueryValueExW)(
__in HKEY hKey,
__in_opt LPCWSTR lpValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_bcount_part_opt(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPBYTE lpData,
__inout_opt LPDWORD lpcbData
); typedef WINADVAPI
LSTATUS
(APIENTRY *FTRegCloseKey)(
__in HKEY hKey
); typedef HRESULT (__stdcall* FTCoInitialize)(
_In_opt_ LPVOID pvReserved
); typedef HRESULT (__stdcall* FTCoCreateInstance)(
__in REFCLSID rclsid,
__in_opt LPUNKNOWN pUnkOuter,
__in DWORD dwClsContext,
__in REFIID riid,
__deref_out LPVOID FAR* ppv); typedef void (__stdcall* FTCoUninitialize)(void); typedef BOOL (__stdcall* FTPathRemoveFileSpecW)(
__inout LPWSTR pszPath
); typedef BOOL (WINAPI* FTDeleteFileW)(
_In_ LPCWSTR lpFileName
); #define START_FUNC_ARRAY() \
struct FunctionArray \
{ \
long size
#define ADD_FUN_ARRAY(_M_, _N_) \
FT ## _N_ p ## _N_
#define END_FUNC_ARRAY() \
} #define GET_MODE_PROC_ADDRESS(_M_, _F_, _T_, _V_) \
do \
{ \
_V_ = (_T_)GetProcAddress(::LoadLibraryA(_M_), _F_); \
if (_V_ == NULL) \
{ \
ErrorLog(); \
return FALSE; \
} \
} while (FALSE) #define GET_PROC_ADDRESS(__M_, __F_) \
GET_MODE_PROC_ADDRESS(__M_, #__F_, FT ## __F_, g_funArray.p ## __F_) #define CALL(_F_) \
g_funArray.p ## _F_ START_FUNC_ARRAY();
ADD_FUN_ARRAY("shell32.dll", SHGetFolderLocation);
ADD_FUN_ARRAY("shell32.dll", SHGetFolderPathW);
ADD_FUN_ARRAY("shell32.dll", SHGetPathFromIDListW);
ADD_FUN_ARRAY("shell32.dll", ILFree); ADD_FUN_ARRAY("Kernel32.dll", GetFileAttributesExW);
ADD_FUN_ARRAY("Kernel32.dll", CreateDirectoryA);
ADD_FUN_ARRAY("Kernel32.dll", GetTempPathA);
ADD_FUN_ARRAY("Kernel32.dll", DeleteFileW); ADD_FUN_ARRAY("Advapi32.dll", RegOpenKeyExW);
ADD_FUN_ARRAY("Advapi32.dll", RegQueryValueExW);
ADD_FUN_ARRAY("Advapi32.dll", RegCloseKey); ADD_FUN_ARRAY("Ole32.dll", CoInitialize);
ADD_FUN_ARRAY("Ole32.dll", CoCreateInstance);
ADD_FUN_ARRAY("Ole32.dll", CoUninitialize); ADD_FUN_ARRAY("Shlwapi.dll", PathRemoveFileSpecW);
END_FUNC_ARRAY(); FunctionArray g_funArray = {sizeof(FunctionArray)}; BOOL InitFunction()
{
GET_PROC_ADDRESS("shell32.dll" , SHGetFolderLocation);
GET_PROC_ADDRESS("shell32.dll" , SHGetFolderPathW);
GET_PROC_ADDRESS("shell32.dll" , SHGetPathFromIDListW);
GET_PROC_ADDRESS("shell32.dll" , ILFree); GET_PROC_ADDRESS("Kernel32.dll" , GetFileAttributesExW);
GET_PROC_ADDRESS("Kernel32.dll" , CreateDirectoryA);
GET_PROC_ADDRESS("Kernel32.dll" , GetTempPathA);
GET_PROC_ADDRESS("Kernel32.dll" , DeleteFileW); GET_PROC_ADDRESS("Advapi32.dll" , RegOpenKeyExW);
GET_PROC_ADDRESS("Advapi32.dll" , RegQueryValueExW);
GET_PROC_ADDRESS("Advapi32.dll" , RegCloseKey); GET_PROC_ADDRESS("Ole32.dll" , CoInitialize);
GET_PROC_ADDRESS("Ole32.dll" , CoCreateInstance);
GET_PROC_ADDRESS("Ole32.dll" , CoUninitialize); GET_PROC_ADDRESS("Shlwapi.dll" , PathRemoveFileSpecW);
return TRUE;
}
先猜猜看,猜不到的往下看
; __int64 Initialize(void)
?Initialize@@YAHXZ proc near ; CODE XREF: DllMain+51p
; DATA XREF: .pdata:000000018000E060o
sub rsp, 28h
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, ProcName ; "SHGetFolderLocation"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CED0, rax
test rax, rax
jnz short loc_180002154 loc_18000214D: ; CODE XREF: Initialize(void)+5Bj
; Initialize(void)+84j ...
xor eax, eax
add rsp, 28h
retn
; --------------------------------------------------------------------------- loc_180002154: ; CODE XREF: Initialize(void)+2Bj
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aShgetfolderpat ; "SHGetFolderPathW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CED8, rax
test rax, rax
jz short loc_18000214D
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aShgetpathfromi ; "SHGetPathFromIDListW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEE0, rax
test rax, rax
jz short loc_18000214D
lea rcx, LibFileName ; "shell32.dll"
call cs:LoadLibraryA
lea rdx, aIlfree ; "ILFree"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEE8, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aGetfileattribu ; "GetFileAttributesExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEF0, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aCreatedirector ; "CreateDirectoryA"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CEF8, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aGettemppatha ; "GetTempPathA"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF00, rax
test rax, rax
jz loc_18000214D
lea rcx, aKernel32_dll_0 ; "Kernel32.dll"
call cs:LoadLibraryA
lea rdx, aDeletefilew ; "DeleteFileW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF40, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegopenkeyexw ; "RegOpenKeyExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF08, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegqueryvaluee ; "RegQueryValueExW"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF10, rax
test rax, rax
jz loc_18000214D
lea rcx, aAdvapi32_dll ; "Advapi32.dll"
call cs:LoadLibraryA
lea rdx, aRegclosekey ; "RegCloseKey"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF18, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCoinitialize ; "CoInitialize"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF20, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCocreateinstan ; "CoCreateInstance"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF28, rax
test rax, rax
jz loc_18000214D
lea rcx, aOle32_dll ; "Ole32.dll"
call cs:LoadLibraryA
lea rdx, aCouninitialize ; "CoUninitialize"
mov rcx, rax ; hModule
call cs:GetProcAddress
mov cs:qword_18000CF30, rax
test rax, rax
jz loc_18000214D
lea rcx, aShlwapi_dll ; "Shlwapi.dll"
call cs:LoadLibraryA
lea rdx, aPathremovefile ; "PathRemoveFileSpecW"
mov rcx, rax ; hModule
call cs:GetProcAddress
xor ecx, ecx
test rax, rax
mov cs:qword_18000CF38, rax
setnz cl
mov eax, ecx
add rsp, 28h
retn
?Initialize@@YAHXZ endp ; ---------------------------------------------------------------------------
谁说编译器不SB的更多相关文章
- String解析
常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.JVM虚拟机为每个被装载的类型维护一个常量池.常量池就是该类型所用到常量的一个有序集和,包括 ...
- Java面向对象-方法的重载
Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...
- 创建String对象过程的内存分配
转载自 https://blog.csdn.net/xiabing082/article/details/49759071 常量池(Constant Pool):指的是在编译期被确定 ...
- VS2005下开发PPC2003和WM50编译器一些设置
1.vs2005开发WM5时,编译器和linker的选项配合问题 链接:http://www.mivi.name/blog/index_en.php?itemid=258 首先说ARM4 ARM4T ...
- 警惕Java编译器中那些“蜜糖”陷阱
一.前言 随着Java编译器不断地向前发展,它为程序员们提供了越来越多的“蜜糖”(compiler suger),极大地方便了程序的开发,例如,foreach的增强模式,自动拆箱与装箱以及字符串的连接 ...
- JSP编译成Servlet(五)JDT Compiler编译器
通过JSP编译器编译后生成了对应的java文件,接下去要把Java文件编译成class文件.对于这部分完全没有必要重新造轮子,常见的优秀编译工具有Eclipse JDT Java编译器和Ant编译器. ...
- .Net拾忆:CodeDom动态源代码生成器和编译器
代码文档模型CodeDom命名空间下主要有两个,很明显第一个代码逻辑分析,第二个负责代码的编译 using System.CodeDom; using System.CodeDom.Compiler; ...
- gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)
总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...
- C# 编译器 和 反编译器,你要哪个(歪头)? 我全都要(捏拳)!
前言 从 C# 6.0 开始,C# 编译器就从以前由 C++ 实现的 csc.exe 换成了用 C# 重新实现的开放式 API 式编译服务 Roslyn.这个编译器到现在已经替代了老式编译器,从前 W ...
随机推荐
- selenium学习笔记(1)
selenium http://selenium-python.readthedocs.io/index.html https://www.seleniumhq.org/projects/ide/ 声 ...
- Python测试代理ip是否有效
方式一: 通过icanhazip.com返回的ip地址进行检测 import requests '''代理IP地址(高匿)''' proxy = { 'http': 'http://117.85.10 ...
- 手动安装easy-install/pip
1.wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py 2.在root用户下 python ez_setup.py -- ...
- PHP通过KMP算法实现strpos
起因 昨天看了阮一峰老师的一篇博客<字符串匹配的KMP算法>,讲的非常棒.这篇文章也是解决了: 有一个字符串"BBC ABCDAB ABCDABCDABDE",里面是否 ...
- RK3288 android切换耳麦通道
通过耳机状态切换耳机mic与板子麦/work/rk3288/firefly-rk3288_android5.1_git_20180126/kernel/sound/soc/codecs/es8323. ...
- P4151 [WC2011]最大XOR和路径 线性基
题目传送门 题意:给出一幅无向图,求1到n的所有路径中最大异或和,一条边可以被重复经过. 思路: 参考了大佬的博客 #pragma GCC optimize (2) #pragma G++ optim ...
- [转载]图文详解YUV420数据格式
原博主的博客为:https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于p ...
- Kafka速览
一.基本结构 三台机器组成的Kafka集群,每台机器启动一个Kafka进程,即Broker 向broker发送消息的客户端是Producer,拉取消息的客户端是Consumer Producer和Co ...
- python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)
搬运出处: https://blog.csdn.net/weixin_44065501/article/details/88899257 # coding:utf-8 import patterns ...
- python实现语音录入识别
一.介绍 1.第一步录音存入本地 2.调用百度语音识别sdk 注意点:百度语音识别对声音源有要求,比特率必须是256kbps 二.代码 #安装必要库 pip install baidu-aip #百度 ...