阅读:1924回复:1
错误:STATUS_DATATYPE_MISALIGNMENT
将下面的c++代码转化成win32汇编时我遇到一个问题,请看:
//ntdef.h typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef UNICODE_STRING *PUNICODE_STRING; typedef const UNICODE_STRING *PCUNICODE_STRING; #define UNICODE_NULL ((WCHAR)0) // winnt // // Object Attributes structure // typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE } OBJECT_ATTRIBUTES; typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; ..................................................... //************ c++ code here************ VOID SomeFunction() { HANDLE hSection=NULL; NTSTATUS status; OBJECT_ATTRIBUTES objectAttributes; UNICODE_STRING objName; CALLGATE_DESCRIPTOR *cg; status = STATUS_SUCCESS; RtlInitUnicodeString(&objName,L\"\\\\Device\\\\PhysicalMemory\"); InitializeObjectAttributes(&objectAttributes, &objName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, (PSECURITY_DESCRIPTOR) NULL); status = ZwOpenSection(&hSection,SECTION_MAP_READ|SECTION_MAP_WRITE,&objectAttributes); ....................................................................................... ....................................................................................... ....................................................................................... } _____________________________________________ I defined the following structs in asm. UNICODE_STRING STRUCT Leng dw ? MaximumLength dw ? Buffer dd ? UNICODE_STRING ENDS OBJECT_ATTRIBUTES STRUCT Leng dd ? RootDirectory dd ? ObjectName dd ? Attributes dd ? SecurityDescriptor dd ? SecurityQualityOfService dd ? OBJECT_ATTRIBUTES ENDS ;**********My asm code here************** .data ObjName UNICODE_STRING <> ObjAtt OBJECT_ATTRIBUTES <> AnObjName db \"\\\\Device\\\\PhysicalMemory\",0 UnObjName dw 50 dup (0) .code Go: invoke MultiByteToWideChar,0,0,addr AnObjName,-1,addr UnObjName,50 ;****InitializeObjName***** invoke RtlInitUnicodeString,addr ObjName,addr UnObjName ;****InitializeObjectAttributes***** mov ObjAtt.Leng,sizeof OBJECT_ATTRIBUTES mov ObjAtt.RootDirectory,NULL mov eax,OBJ_CASE_INSENSITIVE or eax,OBJ_KERNEL_HANDLE mov ObjAtt.Attributes ,eax mov ObjAtt.ObjectName,offset ObjName mov ObjAtt.SecurityDescriptor,NULL mov ObjAtt.SecurityQualityOfService ,NULL invoke ZwOpenSection,addr hSection,SECTION_MAP_READ or SECTION_MAP_WRITE,addr ObjAtt .................................... end go All things work well before i run the exe, I find the returned value of ZwOpenSection is 0x80000002 (=STATUS_DATATYPE_MISALIGNMENT), I wonder how this happened. 这是我在国外的一个论坛发的帖子,但没人给我回帖。 希望您能帮我,谢谢! |
|
沙发#
发布于:2003-01-18 17:17
边界未对齐是指访问单字长的数据时,指定的地址不是偶数地址。访问双字长数据是指定的地址不是四的整数倍。等等。
你看看80386以上CPU的Flag寄存器里的AC位的含义就行了。不过我不能确定你现在的问题是不是这个原因引起的。 |
|