zhongjie
驱动牛犊
驱动牛犊
  • 注册日期2004-08-24
  • 最后登录2006-02-15
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1089回复:0

获得SAA7134和6205设备信息的代码的几点疑问

楼主#
更多 发布于:2005-04-20 22:46
如今,我有一个视频采集卡的驱动,在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;
}
游客

返回顶部