Встроенный ассемблерный код в VC ++ :: требуется помощь по системному вызову WaitForSingleObject - PullRequest
0 голосов
/ 01 апреля 2020

Я кодировал в VS2019 с использованием VC ++ и компилировал с помощью компилятора Intel C ++, 64-битного проигрывателя файлов musi c из командной строки для воспроизведения файлов WAV с использованием WASAPI. Операционная система - Win 7-SP1.

Это часть кода, по которой у меня есть вопросы, и мне нужна помощь. Объявление переменных оставлено для краткости.

// activate an IAudioClient
IAudioClient* pAudioClient;

...
...

// create an event
HANDLE hNeedDataEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// set the event handle
hr = pAudioClient->SetEventHandle(hNeedDataEvent);

...
...

//works fine
do
{
    WaitForSingleObject(hNeedDataEvent, INFINITE);

    hr = pAudioRenderClient->ReleaseBuffer(nFramesInBuffer, 0);
    hr = pAudioRenderClient->GetBuffer(nFramesInBuffer, &pData);

    memcpy(pData, sound_buffer + nBytesToSkip, nBytesThisPass);

    nBytesToSkip += nBytesThisPass;
} while (--nBuffersPlayed);

Я хочу заменить строку кода: WaitForSingleObject (hNeedDataEvent, INFINITE); на встроенный ассемблерный код с использованием системного вызова. Переносимость не важна, так как это только для экспериментов / обучения, потому что я не знаю ассемблера.

Я нашел таблицу системных вызовов для Win7-SP1 на Github , и вот что говорит NtWaitForSingleObject:

; ULONG64 __stdcall NtWaitForSingleObject( ULONG64 arg_01 , ULONG64 arg_02 , ULONG64 arg_03 );
NtWaitForSingleObject PROC STDCALL 

    mov r10 , rcx
    mov eax , 1

    ;syscall
    db 0Fh , 05h

    ret
NtWaitForSingleObject ENDP

Я думаю, что встроенный код сборки для замены вызова WaitForSingleObject должен быть:

__asm
{
    mov r10, ?????? ; pHandle
    xor edx, edx    ; FALSE: The alert cannot be delivered
    xor r8d, r8d    ; Time-out interval, in microseconds. NULL means infinite
    mov eax, 1      ; code number for WaitForSingleObject
    syscall
}

Мои вопросы:

  1. Что именно мне нужно переместить на r10, чтобы он содержал «дескриптор» события?
  2. Правильно ли остальной код встроенного ассемблера?

Кроме того, когда я разобрал свой скомпилированный код, я вижу это:

    mov     rcx, [rbp+220h+hHandle] ; hHandle
    mov     edx, 0FFFFFFFFh ; dwMilliseconds
    call    cs:WaitForSingleObject

1 Ответ

0 голосов
/ 06 апреля 2020
__asm
{
   mov r10, hNeedDataEvent ; pHandle
   xor edx, edx ; FALSE: The alert cannot be delivered
   xor r8d, r8d ; Time-out interval, in microseconds. NULL means infinite
   mov eax, 1 ; code number for WaitForSingleObject syscall
}

Я просто присвоил значение hNeedDataEvent для r10, и это сработало.

...