阅读:837回复:2
一个问题郁闷了我很久,望各位大侠给我解惑(附上代码)
我在驱动程序中经常获取磁盘的设备对象,程序如下:
PDEVICE_OBJECT GetDiskObject(int32 iDiskNumber) { NTSTATUS Status; PFILE_OBJECT fileObject; PDEVICE_OBJECT deviceObject; KEVENT event; UNICODE_STRING DiskWinName; WCHAR szBuffer[64]; RtlZeroMemory(szBuffer,sizeof(szBuffer)); swprintf (szBuffer, L"\\Device\\Harddisk%d\\Partition%d", iDiskNumber,0); RtlInitUnicodeString (&DiskWinName, szBuffer); Status = IoGetDeviceObjectPointer(&DiskWinName, FILE_ALL_ACCESS, &fileObject, &deviceObject); if(NT_SUCCESS(Status)) { ObDereferenceObject(fileObject); return deviceObject; } else return NULL; } 我需要获得的deviceObject,最初我把这个值保存起来,以后对于同一个磁盘我就不需要再获取这个值,后来发现程序经常死机(有时是成功的),我调试了很久,检查代码很久,因为开始没有怀疑是这个问题,后来我发现每次调用IoGetDeviceObjectPointer返回的值不一样,对于同一个磁盘。而且我没有改变系统,也没有再安装驱动。对于每次返回不同的值,我觉得这个可以理解,因为重新获得内存的影像地址不一样。但是为什么我保存的值,它会失效呢,也就是说为什么会在内存中消失呢。 如果真的是这样,那么在adddevice的时候我们经常把它直接下层的设备对象和物理设备对象保存在设备的extension中,如果每次都会变,那保存这些还要什么价值。而且创建设备也是返回设备对象,这是都是临时的,会变化的,那有什么意义。 |
|
沙发#
发布于:2005-07-07 15:32
试试把ObDereferenceObject(fileObject);去掉,改为在不需要返回的DeviceObject的时候再调用ObDereferenceObject
|
|
板凳#
发布于:2005-07-07 17:36
下面是引用tooflat于2005-07-07 15:32发表的: 呵呵,就是这个问题,我已经知道了。我已经试过,只怪我看msdn不仔细,msdn上面说得比较清楚。 |
|