Windows7下驱动开发与调试体系构建——4.在x64下使用汇编代码(x86下的_asm)
asm文件设置
在vs x64中无法使用_asm关键字,需要使用.asm文件。
按第一节的内容创建好项目后,右键Resource Files,添加->新建项->头文件(.h),将名称改为test.asm
右键asm文件,将"从生成中排除"设为"否",将"项类型"设为"自定义生成工具",点击"应用"按钮,配置属性中会增加"自定义生成工具"这一选项。
将"命令行"设为"ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm"
将"输出"设为"$(IntDir)%(fileName).obj"
至此,asm文件设置完毕,接下来进行汇编代码的使用。
汇编代码的使用
在源文件的头部增加这么一行代码:"EXTERN_C void Int_3();"
其中,"EXTERN_C"关键字为驱动使用,而其他语言如c++,关键字不同,为" extern "C" ",这一点需要注意。
接下来就可以使用汇编函数了。
注意,此时无法编译,原因是vs使用了wpp。尝试编译,提示:"wpp Fatal error: CreateFile error"。原因是默认开启了"Wpp Tracing",在项目属性中关闭"Run Wpp Tracing"选项即可编译。
项目代码
Driver.c
#include <ntddk.h> EXTERN_C void Int_3(); // 提供一个Unload函数只是为了让程序能够动态卸载,方便调试 VOID DriverUnload(PDRIVER_OBJECT driver) { // 但是实际上我们什么都不做,只打印一句话: DbgPrint("\r\nASM TEST unloading…\r\n"); } // DriverEntry,入口函数。相当于main。 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) { Int_3(); // 这是我们的内核模块的入口,可以在这里写入我们想写的东西。 DbgPrint("\r\nASM TEST!\r\n"); // 设置一个卸载函数便于这个函数能退出。 driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
test.asm
.CODE Int_3 PROC int 3 ret Int_3 ENDP END