HRESULT _stdcall GetDeviceState(THIS_ DWORD a,LPVOID b) { //This needs to be modified to use b instead of bytes - it would save one copymemory BYTE bytes[256]; HRESULT hr=RealDevice->GetDeviceState(sizeof(bytes),bytes); //push escape to skip the intro if(SkipIntro) { if(SkipIntro2) { bytes[0x01]=0x80; SkipIntro2=false; } else { SkipIntro2=true; } } else if(FinishedFake) { FinishedFake=false; bytes[0x29]=0x80; } else if(UseFakeBuffer==0) { //Only want to respond to keypresses if the buffer is empty for(BYTE b=0;b<32;b++) { if(FakeKeys[b].KeyCode==0) break; if(KEYDOWN(bytes,FakeKeys[b].KeyCode)&&!KEYDOWN(LastBytes,FakeKeys[b].KeyCode)) { bytes[0x29]=0x80; bytes[FakeKeys[b].KeyCode]=0x00; FakeString(FakeKeys[b].chars,FakeKeys[b].data,FakeKeys[b].size); } } } ::CopyMemory(b,bytes,a); ::CopyMemory(LastBytes,bytes,a); return hr; }
HRESULT _stdcall GetDeviceState(DWORD a,LPVOID b) { // This is a keyboard, so get a list of bytes BYTE bytes[MAXMACROS]; HRESULT hr = realDevice->GetDeviceState(256, bytes); if(hr != DI_OK) return hr; // Copy mouse state to act as an extra 10 keys CopyMemory(&bytes[256], &MouseOut, 10); // Get any extra key presses if(GlobalHammer = !GlobalHammer) { for(DWORD byte = 0; byte < 256; byte++) { bytes[byte] |= FakeStates[byte]; bytes[byte] |= HammerStates[byte]; } for(DWORD byte = 256; byte < MAXMACROS - 2; byte++) { bytes[byte] |= FakeStates[byte]; bytes[byte] |= HammerStates[byte]; } } else { for(DWORD byte = 0; byte < 256; byte++) { bytes[byte] |= FakeStates[byte]; bytes[byte] |= AHammerStates[byte]; } for(DWORD byte = 256; byte < MAXMACROS - 2; byte++) { bytes[byte] |= FakeStates[byte]; bytes[byte] |= AHammerStates[byte]; } } if(SkipIntro) { // Push escape to skip the intro if(GlobalHammer) bytes[0x01] = 0x80; } else if(FinishedFake) { // Close the console after faking a command (If using console 1 style) FinishedFake = false; bytes[0x29] = 0x80; } else { // Process triggers DWORD time = GetTickCount(); for(DWORD trigger = 0; trigger < MAXTRIGGERS; trigger++) { if(Triggers[trigger].Active && Triggers[trigger].TimeInterval > 0 && TriggerFireTimes[trigger] < time) { for(int i = 0; i < MAXMACROS; i++) bytes[i] |= Triggers[trigger].Data.KeyStates[i]; TriggerFireTimes[trigger] = time + Triggers[trigger].TimeInterval; } } // Process each key for keypresses for(DWORD key = 0; key < MAXMACROS; key++) { if(FakeKeys[key].type != FKT_Unused && KEYDOWN(bytes,key)) { switch(FakeKeys[key].type) { case FKT_Console1: if(!KEYDOWN(LastBytes,key)) { bytes[0x29]=0x80; FakeString(FakeKeys[key].Console.KeyCodes,FakeKeys[key].Console.KeyStates,FakeKeys[key].Console.Length); CloseConsole=true; } break; case FKT_Console2: if(!KEYDOWN(LastBytes,key)) { FakeString(FakeKeys[key].Console.KeyCodes,FakeKeys[key].Console.KeyStates,FakeKeys[key].Console.Length); CloseConsole=false; } break; case FKT_Hammer1: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte] && GlobalHammer) bytes[byte] = 0x80; } break; case FKT_Hammer2: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) HammerStates[byte] = 0x80; } break; case FKT_Unhammer: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) HammerStates[byte] = 0x00; } break; case FKT_AHammer1: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte] && !GlobalHammer) bytes[byte] = 0x80; } break; case FKT_AHammer2: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) AHammerStates[byte] = 0x80; } break; case FKT_AUnhammer: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) AHammerStates[byte] = 0x00; } break; case FKT_Press1: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) bytes[byte] = 0x80; } break; case FKT_Press2: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) FakeStates[byte] = 0x80; } break; case FKT_Unpress: for(DWORD byte = 0; byte < MAXMACROS; byte++) { if(FakeKeys[key].Press.KeyStates[byte]) FakeStates[byte] = 0x00; } break; case FKT_BeginTimer: if(!KEYDOWN(LastBytes,key)) Triggers[FakeKeys[key].Timer.TimerID].Active = true; break; case FKT_EndTimer: if(!KEYDOWN(LastBytes,key)) Triggers[FakeKeys[key].Timer.TimerID].Active = false; break; case FKT_Graphics: // Activate on keydown only, except for certain functions which should repeat if((!KEYDOWN(LastBytes,key))||(FakeKeys[key].Graphics.function==GF_IncreaseZoom|| FakeKeys[key].Graphics.function==GF_DecreaseZoom|| FakeKeys[key].Graphics.function==GF_IncreaseFOV|| FakeKeys[key].Graphics.function==GF_DecreaseFOV)) { (FakeFuncs[FakeKeys[key].Graphics.function])(); } break; } } } } CopyMemory(b, bytes, a); CopyMemory(LastBytes, bytes, MAXMACROS); CopyMemory(MouseIn, &bytes[256], 10); return DI_OK; }