阅读:1713回复:1
武安河驱动书里面的一个例子的改写,错误在哪里,我搞不明白了,谢谢!第2章的CharSample实例的功能是:一次将一个数字(0-9)转换成一个中文(零-九)。我把改成可以输入3个数字,然后对它进行转化。但是结果只是第一个转化正确,第2,3个都不正确,大家帮我看看,谢谢! int __cdecl main(int argc, char *argv[]) { //=== Parameterized IOCTL Example === // int nVal; // ULONG dwVal; DWORD Error; printf("Test application Test_CharSample starting...\n"); hDevice = OpenByInterface( &ClassGuid, 0, &Error); if (hDevice == INVALID_HANDLE_VALUE) { printf("ERROR opening device: (%0x) returned from CreateFile\n", GetLastError()); Exit(1); } else { printf("Device found, handle open.\n"); } CHAR bufInput[3]; // Input to device CHAR bufOutput[6]; // Output from device ULONG nOutput; // Count written to bufOutput printf("请输入三个数字(0-9)\n"); l0: bufInput[0]=_getch(); if ((bufInput[0]<'0') || (bufInput[0]>'9')) goto l0; _putch(bufInput[0]); l1: bufInput[1]=_getch(); if ((bufInput[1]<'0') || (bufInput[1]>'9')) goto l1; _putch(bufInput[1]); l2: bufInput[2]=_getch(); if ((bufInput[2]<'0') || (bufInput[2]>'9')) goto l2; _putch(bufInput[2]); if (!DeviceIoControl(hDevice, CHARSAMPLE_IOCTL_800,// bufInput, 3, bufOutput, 6, &nOutput, NULL) ) { printf("ERROR: DeviceIoControl returns %0x.", GetLastError()); Exit(1); } printf(":"); _putch(bufOutput[0]); _putch(bufOutput[1]); _putch(bufOutput[2]); _putch(bufOutput[3]); _putch(bufOutput[4]); _putch(bufOutput[5]); printf("\n"); CloseIfOpen(); return 0; } NTSTATUS CharSampleDevice::DeviceControl(KIrp I) //改掉 { NTSTATUS status; CHAR n,c[]="零一二三四五六七八九"; switch (I.IoctlCode()) { case CHARSAMPLE_IOCTL_800: nin=I.IoctlInputBufferSize(); //要转换的数字数目,如3个数字 cin=new (NonPagedPool) CHAR[nin];//申请一个内存,用于存放数字 if ( cin == NULL ) { return STATUS_INSUFFICIENT_RESOURCES; } nout=I.IoctlOutputBufferSize(); //输出缓冲区大小,如6个字节 cout=new (NonPagedPool) CHAR[nout]; //申请一个内存,用于存放中文 if ( cout == NULL ) { delete cin; return STATUS_INSUFFICIENT_RESOURCES; } strncpy(cin,(PCHAR)I.IoctlBuffer(),nin);//将数字字符拷贝到cin中 逐个转化 for(int i=0;i<3;i++) { strncpy((PCHAR)I.IoctlBuffer(),cin,1);//将cin缓冲区的值赋值到IoctlBuffer n=*(CHAR *)I.IoctlBuffer();//输入n=应用程序传给驱动程序的数字ASCII码 if ((n >= '0') && (n <= '9')) { //若为数字,则处理 n -= '0'; //n=数字(0-9) strncpy((PCHAR)I.IoctlBuffer(),&c[n*2],2); strncpy(cout,(PCHAR)I.IoctlBuffer(),2); //将转换后的中文字符拷贝到cout中 cin++; cout += 2; //调整cout指针,+2是因为一个中文占2个字节空间 } } cout -= nout; //调整cout指针,指向缓冲区的头 strncpy((PCHAR)I.IoctlBuffer(),cout,nout); //将转换后的全部中文字符拷贝到应用程序的缓冲区 I.Information() = nout; if (cout) delete cout; //删除cout //cin -= (nout - 2)/2; //调整cin指针,指向缓冲区的头= cin=cin-nin; if (cin) delete cin; //删除cin status = STATUS_SUCCESS; default: // Unrecognized IOCTL request status = STATUS_INVALID_PARAMETER; break; } return I.PnpComplete(this, status); } |
|
沙发#
发布于:2009-12-18 11:53
回 楼主(zhonghong200) 的帖子
for(int i=0;i<3;i++){ strncpy((PCHAR)I.IoctlBuffer(),cin,1);//将cin缓冲区的值赋值到IoctlBuffer n=*(CHAR *)I.IoctlBuffer();//输入n=应用程序传给驱动程序的数字ASCII码 if ((n >= '0') && (n <= '9')) { //若为数字,则处理 n -= '0'; //n=数字(0-9) strncpy((PCHAR)I.IoctlBuffer(),&c[n*2],2); strncpy(cout,(PCHAR)I.IoctlBuffer(),2); //将转换后的中文字符拷贝到cout中 cin++; cout += 2; //调整cout指针,+2是因为一个中文占2个字节空间 } } 在这个for循环里面之用cin和cout,也不知道你用I.IoctlBuffer()干嘛, for完了之后不是有strncpy((PCHAR)I.IoctlBuffer(),cout,nout) 吗?程序结构不清晰,不简洁。所以,实在让人懒得看下去 |
|