阅读:1377回复:3
这个页错误是怎么回事啊!
代码如下,简单明目(错误蹊跷):
POBJECT_NAME_INFORMATION nameInfo = NULL; ... nameInfo = (POBJECT_NAME_INFORMATION)ExAllocatePoolWithTag( NonPagedPool, 256*2, SFLT_POOL_TAG ); status = ObQueryNameString(irpSp->FileObject, nameInfo, 256*2, &size ); if(status == STATUS_BUFFER_OVERFLOW) { nameInfo = (POBJECT_NAME_INFORMATION)ExAllocatePoolWithTag( NonPagedPool, size + 2, SFLT_POOL_TAG ); ASSERT(NULL != nameInfo); ObQueryNameString(irpSp->FileObject, nameInfo, size+2, &size ); } -------> if(nameInfo->Name.Length != 0 && nameInfo->Name.Buffer != NULL && 0 == RtlCompareString((PSTRING)nameInfo->Name.Buffer, (PSTRING)L"\\Device\\HarddiskVolume1\\good.doc", TRUE)) {.... } 在"------->" 的地方出现了页错误了。怎么回事?nameInfo已经正确取得了啦! 这个代码是在MJ_Create里面写的,此时IoCallDriver()已经调用返回了![p:4] |
|
|
沙发#
发布于:2007-03-20 06:51
引用第0楼张书爱玉于2007-03-19 18:53发表的“这个页错误是怎么回事啊!”: typedef struct _STRING { USHORT Length; USHORT MaximumLength; #ifdef MIDL_PASS [size_is(MaximumLength), length_is(Length) ] #endif // MIDL_PASS PCHAR Buffer; } STRING; LONG RtlCompareString( IN PSTRING String1, IN PSTRING String2, BOOLEAN CaseInSensitive ); typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; #ifdef MIDL_PASS [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer; #else // MIDL_PASS PWSTR Buffer; #endif // MIDL_PASS } UNICODE_STRING; NTSTATUS ObQueryNameString( IN PVOID Object, OUT POBJECT_NAME_INFORMATION ObjectNameInfo, IN ULONG Length, OUT PULONG ReturnLength ); 仔细看看这些定义~~~你彻底把东西搞混了... 而且第二次ExAllocatePoolWithTag的时候,要把前一次的memory释放掉 |
|
|
板凳#
发布于:2007-03-20 09:40
真是谢谢阿。我不知道STRING的定义竟然是这样的,一直以为是字符串呢。没有你的提示,我怎么也不能领会到这个地步啊,谢谢。
|
|
|
地板#
发布于:2008-01-04 16:36
|
|