Я кодировал в 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
}
Мои вопросы:
- Что именно мне нужно переместить на r10, чтобы он содержал «дескриптор» события?
- Правильно ли остальной код встроенного ассемблера?
Кроме того, когда я разобрал свой скомпилированный код, я вижу это:
mov rcx, [rbp+220h+hHandle] ; hHandle
mov edx, 0FFFFFFFFh ; dwMilliseconds
call cs:WaitForSingleObject