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;
 }
示例#2
0
    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;
    }