cnambiman
驱动牛犊
驱动牛犊
  • 注册日期2003-01-09
  • 最后登录2003-11-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1924回复:1

错误:STATUS_DATATYPE_MISALIGNMENT

楼主#
更多 发布于:2003-01-16 16:59
将下面的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.

这是我在国外的一个论坛发的帖子,但没人给我回帖。
希望您能帮我,谢谢!




melchior
驱动牛犊
驱动牛犊
  • 注册日期2002-07-09
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望15点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-01-18 17:17
边界未对齐是指访问单字长的数据时,指定的地址不是偶数地址。访问双字长数据是指定的地址不是四的整数倍。等等。
你看看80386以上CPU的Flag寄存器里的AC位的含义就行了。不过我不能确定你现在的问题是不是这个原因引起的。
游客

返回顶部