Я пишу функцию сборки, которая будет вызываться из C, которая вызовет машинную инструкцию sidt
с адресом памяти, передаваемым в функцию C.Из моего анализа кода, созданного MSVC10, я построил следующий код (синтаксис YASM):
SECTION .data
SECTION .text
GLOBAL _sidtLoad
_sidtLoad:
push ebp
mov ebp,esp
sub esp,0C0h
push ebx
push esi
push edi
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
sidt [ebp+8]
pop edi
pop esi
pop ebx
add esp,0C0h
cmp ebp,esp
mov esp,ebp
pop ebp
ret
Вот сигнатура функции C:
void sidtLoad (void* mem);
Насколько яможет видеть, что все должно работать, я даже проверил адрес памяти, переданный функции, и увидел, что он совпадает с адресом, хранящимся в [ebp + 8] (байты обращены, что, я полагаю, является результатом порядка байтов и должно обрабатыватьсяна машине).Я пробовал другие аргументы для инструкции sidt
, такие как [ebp + 12], [ebp + 4], [ebp-8] и т. Д., Но не повезло.
PS Я пишу это на внешнеммодуль сборки, чтобы обойти отсутствие встроенной сборки при нацеливании на x64 с помощью MSVC10.Тем не менее, эта конкретная функция / программа сборки выполняется как x86, просто чтобы я мог справиться со всем процессом.
PPS Я не использую встроенную __sidt
как Windows Driver Kit (WDK)кажется, не поддерживает это.Или, по крайней мере, я не могу заставить его работать с этим!