标签:
读写操作一般是由ReadFile和WriteFile函数引起的,这里先以WriteFile函数为例进行介绍。WriteFile要求用户提供一段缓冲区,并且说明缓冲区的大小,然后WriteFile将这段内存的数据传入到驱动程序中。这种方法,操作系统将应用程序提供缓冲区数据直接复制到内核模式的地址中。这样做,比较简单的解决了将用户地址传入驱动的问题,而缺点是需要在用户模式和内核模式之间复制数据,影响了效率。在少量内存操作时,可以采用这种方法。拷贝到内核模式下的地址由WriteFile创建的IRP的AssociatedIrp.SystemBuffer子域记录。
下面的代码演示了如何利用缓冲区方式读取设备,这个例子中,驱动程序负责向缓冲区中填入了数据:
应用层调用ReadFile,想驱动传送一个读IRP请求:
1 int main(){ 2 HANDLE hDevice = 3 CreateFile("\\\\.\\HelloDDK", 4 GENERIC_READ | GENERIC_WRITE, 5 0, NULL, 6 OPEN_EXISTING, 7 FILE_ATTRIBUTE_NORMAL, 8 NULL); 9 if (hDevice == INVALID_HANDLE_VALUE){ 10 printf("Open device failed!\n"); 11 } 12 else{ 13 printf("Open device succeed!\n"); 14 } 15 UCHAR buffer[10]; 16 ULONG ulRead; 17 BOOL bRet = ReadFile(hDevice, buffer, 10, &ulRead, NULL); 18 if (bRet){ 19 printf("Read %d bytes!", ulRead); 20 for (int i = 0; i < (int)ulRead; i++){ 21 printf("%02X", buffer[i]); 22 } 23 printf("\n"); 24 } 25 CloseHandle(hDevice); 26 system("pause"); 27 return 0; 28 }
运行之后的结果如下:
标签:
原文地址:http://www.cnblogs.com/predator-wang/p/5532125.html