阅读:1090回复:0
获得SAA7134和6205设备信息的代码的几点疑问
如今,我有一个视频采集卡的驱动,在AddDevice中有这么这么一段代码:
void GetDeviceInfo(PDEVICE_OBJECT DeviceObject) { NTSTATUS status; int i; ULONG ResultLength; ULONG SubVendorID; ULONG SubSystemID; ULONG VendorID; ULONG Test; CHAR *buffer; CHAR *buffer1; CHAR *buffer2; buffer=(CHAR*)ExAllocatePool(PagedPool,1000); buffer1=(CHAR*)ExAllocatePool(PagedPool,5); buffer2=(CHAR*)ExAllocatePool(PagedPool,500); memset(buffer, 0, 1000 status=IoGetDeviceProperty(DeviceObject, DevicePropertyHardwareID, 1000, &buffer[0], &ResultLength ); for(i=0; i<500; i++) buffer2=buffer[2*i]; buffer2[499]=0; // DebugPrint(\"%s\", buffer2); /* if(!NT_SUCCESS(status)) { // DebugPrintMsg(\"get HID error\"); // if(status==STATUS_BUFFER_TOO_SMALL)DebugPrintMsg(\"Buffer too small\"); // if(status==STATUS_INVALID_PARAMETER_2)DebugPrintMsg(\"error properties\"); // if(status==STATUS_INVALID_DEVICE_REQUEST)DebugPrintMsg(\"error pdo\"); // DebugPrint(\"HID:%u\",ResultLength); }*/ for(i=0;i<4;i++) { buffer1=buffer[2*i+16]; } buffer1[4]=0; VendorID=HexCharToInt(buffer1); // DebugPrint(\"VendorID:%x\",VendorID); for(i=0;i<4;i++) { buffer1=buffer[2*i+58]; } buffer1[4]=0; SubSystemID=HexCharToInt(buffer1); KdPrint((\"SubsystemID:%x\",SubSystemID)); for(i=0;i<4;i++) { buffer1=buffer[2*i+66]; } buffer1[4]=0; SubVendorID=HexCharToInt(buffer1); KdPrint((\"SubVendorID:%x\",SubVendorID)); //used to indicate the borad with same pci_venderid and pci_deviceid but unexpected //subvendorid and subsystemid BoardVersion=0xffff; /*if(0xffff == SubVendorID) { // DebugPrintMsg(\"Reva0\"); BoardVersion = REVA0; }*/ if(VENDORID_TI != VendorID){ if(SUBVENDOR_HONG== SubVendorID) { switch(SubSystemID) { case SUBSYS_AVE2KREVC1S: BoardVersion = REVC1; break; case SUBSYS_AVE2KREVC1D: BoardVersion = REVC1; break; case SUBSYS_AVE2KREVC1Q: BoardVersion = REVC1; break; case SUBSYS_AVE5KREVC1Q: BoardVersion = REVC1; break; } } //#if(TARGET_DEVICE==TD_TEST) else BoardVersion = REVC1; //#endif } else BoardVersion = E_REVC1; KdPrint((\"BoardVersion=%d\\n\", BoardVersion)); ExFreePool(buffer); ExFreePool(buffer1); ExFreePool(buffer2); } 这段代码的主要作用是什么,它是根据什么要这么做。其中函数 ULONG HexCharToInt(char *buf) { ULONG i,j,retVal=0; for(i=0;i<4;i++) { switch(buf) { case \'0\': case \'1\': case \'2\': case \'3\': case \'4\': case \'5\': case \'6\': case \'7\': case \'8\': case \'9\': j=buf-\'0\'; break; case \'A\': case \'B\': case \'C\': case \'D\': case \'E\': case \'F\': j=buf-\'A\'+10; break; case \'a\': case \'b\': case \'c\': case \'d\': case \'e\': case \'f\': j=buf-\'a\'+10; break; default: j=0; } retVal=retVal*16+j; } return retVal; } |
|