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


浙公网安备 33010602011771号