LarryWang1234
驱动牛犊
驱动牛犊
  • 注册日期2002-10-22
  • 最后登录2003-01-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3903回复:10

看看这段代码,为什么‘IoGetDeviceProperty’老是异常,计算机崩溃呢?

楼主#
更多 发布于:2002-10-22 10:25
NTSTATUS Status;
UNICODE_STRING DeviceName;
ULONG HarkDiskNumber;
ULONG PartitionNumber;
char nnn[256];
ANSI_STRING aIdName;
WCHAR ubuf[256];
UNICODE_STRING ddddd;
PDEVICE_OBJECT DiskDeviceObjects = NULL;
PFILE_OBJECT DiskFileObjects = NULL;
PWCHAR szGUID = NULL;

PAGED_CODE();

ddddd.Buffer = ubuf;
ddddd.MaximumLength = 256;

HarkDiskNumber = 0;
sprintf(nnn, \"\\\\DosDevices\\\\PhysicalDrive%d\", HarkDiskNumber);

aIdName.Length = strlen(nnn);
aIdName.MaximumLength = aIdName.Length+1;
aIdName.Buffer = nnn;

Status = RtlAnsiStringToUnicodeString(&ddddd, &aIdName,FALSE );

if (NT_SUCCESS(Status))
        DbgPrint(\"\");
else {
         DbgPrint(\"Error converting ansi string to unicode string: %08lx.\\n\", Status);
         goto FINALLY;
}

Status = IoGetDeviceObjectPointer(&ddddd, FILE_READ_DATA | FILE_WRITE_DATA, &DiskFileObjects, &DiskDeviceObjects);

if (! NT_SUCCESS(Status)) {
       DbgPrint(\"Error GetDeviceObjectPointer: %08lx.\\n\", Status);
        goto FINALLY;
}
else {
        DbgPrint(\"IoGetDeviceObjectPointer ok\");
}

lResultLenght = 0;
Status = IoGetDeviceProperty(DiskDeviceObjects, DevicePropertyPhysicalDeviceObjectName,  lResultLenght, szGUID, &lResultLenght);
if (Status == STATUS_BUFFER_TOO_SMALL && lResultLenght != 0)
{
      szGUID = ExAllocatePool (NonPagedPool, lResultLenght);
      if (szGUID == NULL)
      {
        DebugPrint(\"Check disk Error: IoGetDeviceProperty: %08lx.\\n\", Status);
         goto FINALLY;
}
       }
       else {
          DebugPrint(\"Check disk Error:   IoGetDeviceProperty: %08lx.\\n\", Status);
 goto FINALLY;
}

Status = IoGetDeviceProperty(DiskDeviceObjects, DevicePropertyClassGuid,  lResultLenght, szGUID, &lResultLenght);
if (! NT_SUCCESS(Status)) {
DebugPrint(\"Check disk Error: IoGetDeviceProperty: %08lx.\\n\", Status);
goto FINALLY;
}
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-23 14:40
仔细看看这段话
Comments
IoGetDeviceProperty retrieves device setup information from the registry. Use this routine, rather than accessing the registry directly, to insulate a driver from differences across platforms and from possible changes in the registry structure.

For many DeviceProperty requests, it can take two or more calls to IoGetDeviceProperty to determine the required BufferLength. The first call should use a best-guess value. If the return status is STATUS_BUFFER_TOO_SMALL, the driver should free its current buffer, allocate a buffer of the size returned in ResultLength, and call IoGetDeviceProperty again. Because some of the setup properties are dynamic, the data size can change between the time the required size is returned and driver calls this routine again. Therefore, drivers should call IoGetDeviceProperty inside a loop that executes until the return status is not STATUS_BUFFER_TOO_SMALL.

Function drivers that support devices on a legacy bus and a PnP bus can use the DevicePropertyBusNumber, DevicePropertyBusTypeGuid, and DevicePropertyLegacyBusType properties to distinguish between the buses.

Callers of IoGetDeviceProperty must be running at IRQL PASSIVE_LEVEL in the context of a system thread.

建议你用__try...__except()...__finally在你的驱动中,可以检测出异常。
Tom_lyd
LarryWang1234
驱动牛犊
驱动牛犊
  • 注册日期2002-10-22
  • 最后登录2003-01-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-23 15:56
谢谢你的回复!

这个程序一运行到‘IoGetDeviceProperty’函数,系统就Dump,从起了。好象是第一个参数DiskDeviceObjects不能给这个函数似的。
我实在是搞不懂了。

我的目的就是:通过‘IoGetDeviceProperty’获得磁盘的一些信息,比如GUID等信息。不知道还有什么别的办法吗。


我是新手,最近被DDK搞的真烦啊。

Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-23 17:29
获得磁盘的ID在应用层就可以搞定。
Tom_lyd
LarryWang1234
驱动牛犊
驱动牛犊
  • 注册日期2002-10-22
  • 最后登录2003-01-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-23 17:55
我在写驱动程序啊

我的程序是这样的:

先让用户选者我们要管理的那个磁盘那个分区,
然后我的驱动会依据这些信息直接读区我们要管理的分区。
这个分区不能靠磁盘上的分区信息获得,所以我想先获得安装时选者的磁盘号和分区号,取得这个磁盘的一些标记性信息,记入我的注册表项,下次从起计算机的时候,我依据这些注册表信息枚举出用户安装是指定的分区(就是我们要管理的分区,注意:这个分区对应的磁盘号可能因为某些原因而改变了顺序号,所以我必须记住这个磁盘的标记性信息,比如:GUID, SerialNumber).

现在的问题是我不知道怎么样才可以获得磁盘的这些标记性信息。

Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-24 10:30
我在写驱动程序啊

我的程序是这样的:

先让用户选者我们要管理的那个磁盘那个分区,
然后我的驱动会依据这些信息直接读区我们要管理的分区。
这个分区不能靠磁盘上的分区信息获得,所以我想先获得安装时选者的磁盘号和分区号,取得这个磁盘的一些标记性信息,记入我的注册表项,下次从起计算机的时候,我依据这些注册表信息枚举出用户安装是指定的分区(就是我们要管理的分区,注意:这个分区对应的磁盘号可能因为某些原因而改变了顺序号,所以我必须记住这个磁盘的标记性信息,比如:GUID, SerialNumber).

现在的问题是我不知道怎么样才可以获得磁盘的这些标记性信息。

 


磁盘的SerialNumber不是针对分区的,而是针对整个硬盘的,一个硬盘只有一个SerialNumber,它是由硬件厂商固在内部芯片上的。不过当硬盘被分区格式化后,每一个逻辑分区分有一个VolumeNumber,这是由Format程序写上去的,是软ID,它是相对变化的。
所以,你如果想达到你上述的目的,还需要选择一个有真正标识性的参数。
Tom_lyd
LarryWang1234
驱动牛犊
驱动牛犊
  • 注册日期2002-10-22
  • 最后登录2003-01-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-24 11:33
那我怎么在驱动程序里得到这些参数啊?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-25 12:18
参看这个一下
附件名称/大小 下载次数 最后更新
2002-10-25_mountmgr.zip (611KB)  59
Tom_lyd
LarryWang1234
驱动牛犊
驱动牛犊
  • 注册日期2002-10-22
  • 最后登录2003-01-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-28 12:11
谢谢,Tom_lyd

我已经解决了这个问题

附件名称/大小 下载次数 最后更新
2002-10-28_EnumDisk.c (18KB)  56
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-28 12:25
Congradulations!
Tom_lyd
zhancj6022
驱动牛犊
驱动牛犊
  • 注册日期2011-11-23
  • 最后登录2012-03-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2012-03-06 19:07
我现在也遇到这个问题,附件无法下载,你能把附件传给我吗?QQ:602293601,谢谢
游客

返回顶部