[закрыто] x64: мне качественно отстреливает ногу
len=wcslen(s->pwszName;
0000000140013B87 mov rax,qword ptr [s]
0000000140013B8C mov rcx,qword ptr [rax+0Ch]
0000000140013B90 call wcslen (1404C2870h)
после выполнения mov rcx, qword ptr [rax+0Ch] имеем в rcx: 0x001a241800000000
Щ_щ
LPCWSTR pwszName;Вот за это люблю FailAPI.
похоже на разную endianness
куда можно копать?это может быть нарушение ODR
структура в разных единицах трансляции определена по-разному
внимательно посмотри какие макросы используются в определении структуры. эти макросы могут развернутся в разные вещи в разных либах\исходниках
компилируем на семёрке x86. запускаем из-под rdb на win2003 R2 SP2 x64
к вопросу - почему +0Ch?
typedef struct S {
DWORD ...;
LPCSTR ...;
LPCWSTR pwszName;
DWORD ...;
...
DWORD -4 байта, LPCSTR - 8 (64 бит же!?) итого - 12 = 0xC
ну не может же в самом деле или sizeof(LPCSTR) = 4?
проверю гипотезу sizeof(LPCSTR)==4 на 64 битной платформе
проверю гипотезу sizeof(LPCSTR)==4http://msdn.microsoft.com/en-us/library/cc230350.aspx
короче надо будет найти, кто забыл сделать #pragma pop на #pragma push pack(4)
и подвесить за йайца
на 64-битной платформе?Технологии Майкроусофт™.
Changes to Windows data typeshttp://www.godevtool.com/GoasmHelp/64bits.htm
Here is a list of the changes to data types between 32 and 64-bits:-
All handles now qwords not dwords
eg.
HACCEL, HINSTANCE, HBRUSH, HBITMAP
HCOLORSPACE, HCURSOR, HDC, HFONT
HICON, HINSTANCE, HKEY, HLOCAL
HMENU, HMODULE, HPEN, HPALETTE, HWND
(and others starting with H)
exceptions:- HRESULT, HFILE which remain dwords, and HALF_PTR (see below)
All pointers now qwords not dwords
eg.
LPCSTR, LPCTSTR, LPLONG, LPSTR
(and others starting with LP)
PBOOL, PHANDLE, PHKEY, PVOID
(and others starting with P)
DWORD_PTR, ULONG_PTR, UINT_PTR
(and others ending with _PTR)
and LRESULT
exceptions:- HALF_PTR, and UHALF_PTR which are now dwords instead of a word and POINTER_32 which remains a 32-bit pointer
Ты какую-то немножко не мелкософтную ссылку дал.
первую из гугла. На msdn-е тоже есть, но надо будет чуток поискать.
LPCSTR этож указатель, все указатели 8 байт на 64бита и 4 на 32бита.
DWORD ...;если DWORD 32-бита то после него 32-бита дырка выравнивания
LPCSTR ...;
LPCWSTR pwszName;
спасибо, я уже поправил злополучный #pragma pack
да уж, качественно отстрелил ногу
Оставить комментарий
yolki
Винда.Смотрю отладчиком строку (*).
На входе:
Идём внутрь wcslen
смотрим отладчиком wcs:
WTF?
куда можно копать?