HRESULT WriteAdaptoidPak( LPDIRECTINPUTDEVICE8 lpDirectInputDevice, DWORD addr, LPBYTE data ) { DIEFFESCAPE esc; struct { DWORD addr; BYTE data[32]; } buf; buf.addr = addr; CopyMemory( buf.data, data, 32 ); esc.dwSize = sizeof(esc); esc.dwCommand = ADAPT_WRITEPAK; // Write 32 bytes to pak esc.lpvInBuffer = &buf; esc.cbInBuffer = 36; esc.lpvOutBuffer = NULL; esc.cbOutBuffer = 0; HRESULT hr = lpDirectInputDevice->Escape(&esc); #ifdef _DEBUG LPCSTR suc = (SUCCEEDED(hr)) ? "OK" : "FAILED"; DebugWriteA( "Direct Adaptoid WritePak(Addr:%04X): %s (RC:%08X)\n", addr, suc, hr ); #endif // #ifdef _DEBUG return hr; }
HRESULT InitializeAdaptoid( LPDIRECTINPUTDEVICE8 lpDirectInputDevice, LPBYTE status ) { DIEFFESCAPE esc; esc.dwSize = sizeof(esc); esc.dwCommand = ADAPT_INIT; // Initialize Pak esc.lpvInBuffer = NULL; esc.cbInBuffer = 0; esc.lpvOutBuffer = status; esc.cbOutBuffer = 1; HRESULT hr = lpDirectInputDevice->Escape(&esc); #ifdef _DEBUG _debugAd( "Direct Adaptoid InitPak", hr ); #endif // #ifdef _DEBUG return hr; }
HRESULT DirectRumbleCommand( LPDIRECTINPUTDEVICE8 lpDirectInputDevice, DWORD cmd ) { DIEFFESCAPE esc; esc.dwSize = sizeof(esc); esc.dwCommand = ADAPT_RUMBLE; // send rumble command esc.lpvInBuffer = &cmd; // 1=go, 0=stop esc.cbInBuffer = 4; esc.lpvOutBuffer = NULL; esc.cbOutBuffer = 0; HRESULT hr = lpDirectInputDevice->Escape(&esc); #ifdef _DEBUG _debugAd( "Direct Adaptoid RumbleCommand", hr ); #endif // #ifdef _DEBUG return hr; }
bool IsAdaptoidCommandSupported( LPDIRECTINPUTDEVICE8 lpDirectInputDevice, DWORD cmd ) { DIEFFESCAPE esc; DWORD inbuf, outbuf; HRESULT hr; esc.dwSize = sizeof(esc); esc.dwCommand = ADAPT_TEST; // command to determine if a command is supported esc.lpvInBuffer = &inbuf; esc.cbInBuffer = 4; esc.lpvOutBuffer = &outbuf; esc.cbOutBuffer = 4; inbuf = cmd; // command that we are asking is supported outbuf = 0; hr = lpDirectInputDevice->Escape(&esc); return( SUCCEEDED(hr) && esc.cbOutBuffer == 4 && outbuf == 0xB0CAB0CA ); }
HRESULT ReadAdaptoidPak( LPDIRECTINPUTDEVICE8 lpDirectInputDevice, DWORD addr, LPBYTE data ) { DIEFFESCAPE esc; esc.dwSize = sizeof(esc); esc.dwCommand = ADAPT_READPAK; // Read 32 bytes from pak esc.lpvInBuffer = &addr; esc.cbInBuffer = 4; esc.lpvOutBuffer = data; esc.cbOutBuffer = 32; HRESULT hr = lpDirectInputDevice->Escape(&esc); #ifdef _DEBUG LPCSTR suc = (SUCCEEDED(hr)) ? "OK" : "FAILED"; DebugWriteA( "Direct Adaptoid ReadPak(Addr:%04X): %s (RC:%08X)\n", addr, suc, hr ); #endif // #ifdef _DEBUG return hr; }
HRESULT _stdcall Escape(LPDIEFFESCAPE a) { return RealDevice->Escape(a); }