Windows7下驱动开发与调试体系构建——4.在x64下使用汇编代码(x86下的_asm)

目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html


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 

posted @ 2021-02-25 19:53  byxiaobai  阅读(815)  评论(0)    收藏  举报