驱动程序运行程序的过程主要涉及 读写外设的外部寄存器。以下是一个简化的步骤说明:
创建设备
使用`CreateFile`函数创建一个虚拟设备文件,例如` \\\\.\\HelloDDK`,并指定访问模式为`GENERIC_READ`。
发送读请求
应用层调用`ReadFile`函数,向驱动程序发送一个读IRP(I/O请求包)请求,指定要读取的数据量和缓冲区地址。
处理读请求
驱动程序的派遣函数`HelloDDKDispatchRead`被调用,接收`PDEVICE_OBJECT`和`PIRP`参数。
在派遣函数中,驱动程序通过读写外设的外部寄存器来获取数据,并将数据填入缓冲区。
返回数据
驱动程序将数据从外部寄存器读取到缓冲区,并通过`ReadFile`函数将数据返回给应用层。
关闭设备
应用层使用`CloseHandle`函数关闭设备句柄。
```c
include include NTSTATUS HelloDDKDispatchRead(PDEVICE_OBJECT pDevObj, PIRP pIrp) { ULONG ulRead = pIrp->Parameters.Read.Length; BYTE buffer; ULONG i = 0; while (i < ulRead) { buffer[i] = 0; // 读取外部寄存器的数据 i++; } // 将数据从缓冲区复制到IRP的SystemBuffer子域 RtlCopyMemory(pIrp->SystemBuffer, buffer, ulRead); // 完成IRP pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = ulRead; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } int main() { HANDLE hDevice; ULONG ulRead = 256; BYTE buffer; hDevice = CreateFile(" \\\\.\\HelloDDK", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice == INVALID_HANDLE_VALUE) { printf("Failed to create device.\n"); return 1; } printf("Reading from device...\n"); if (!ReadFile(hDevice, buffer, ulRead, NULL, NULL)) { printf("Failed to read from device.\n"); CloseHandle(hDevice); return 1; } printf("Data read from device:\n"); for (ULONG i = 0; i < ulRead; i++) { printf("%02X ", buffer[i]); } printf("\n"); CloseHandle(hDevice); system("pause"); return 0; } ``` 在这个示例中,驱动程序通过`HelloDDKDispatchRead`函数读取外部寄存器的数据,并将其复制到IRP的`SystemBuffer`子域,然后完成IRP。应用层通过`ReadFile`函数发送读请求,并接收返回的数据。