Advertisement
GK-Chubbz

ddraw.dll STUB

Nov 26th, 2015
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.64 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////
  2. // You may dinput8.dll is detected even if the hook FindFirstFileA.
  3. // In place, it may be able to avoid in ddraw.dll.
  4. //
  5.  
  6. ////////////////////////////////////////////////////////////////////
  7. // =================================================================
  8. // ddraw.cpp
  9. // =================================================================
  10. #include "ddraw.h"
  11.  
  12. #include <detours.h> // detours 3.0
  13. #pragma comment(lib, "detours.lib")
  14.  
  15. #include <tchar.h>
  16. #include <ShlObj.h>
  17. #define STRSAFE_NO_DEPRECATE
  18. #include <strsafe.h>
  19.  
  20. BOOL DetourFunction(BOOL fStatus, LPVOID* lppvFunction, LPVOID lpvRedirection)
  21. {
  22.         if (DetourTransactionBegin() != NO_ERROR)
  23.                 return FALSE;
  24.  
  25.         if (DetourUpdateThread(GetCurrentThread()) == NO_ERROR)
  26.                 if ((fStatus ? DetourAttach : DetourDetach)(lppvFunction, lpvRedirection) == NO_ERROR)
  27.                         if (DetourTransactionCommit() == NO_ERROR)
  28.                                 return TRUE;
  29.  
  30.         DetourTransactionAbort();
  31.         return FALSE;
  32. }
  33.  
  34. namespace ddraw
  35. {
  36.         AcquireDDThreadLock_t                   _AcquireDDThreadLock;
  37.         CompleteCreateSysmemSurface_t   _CompleteCreateSysmemSurface;
  38.         D3DParseUnknownCommand_t                _D3DParseUnknownCommand;
  39.         DDGetAttachedSurfaceLcl_t               _DDGetAttachedSurfaceLcl;
  40.         DDInternalLock_t                                _DDInternalLock;
  41.         DDInternalUnlock_t                              _DDInternalUnlock;
  42.         DSoundHelp_t                                    _DSoundHelp;
  43.         DirectDrawCreate_t                              _DirectDrawCreate;
  44.         DirectDrawCreateClipper_t               _DirectDrawCreateClipper;
  45.         DirectDrawCreateEx_t                    _DirectDrawCreateEx;
  46.         DirectDrawEnumerateA_t                  _DirectDrawEnumerateA;
  47.         DirectDrawEnumerateExA_t                _DirectDrawEnumerateExA;
  48.         DirectDrawEnumerateExW_t                _DirectDrawEnumerateExW;
  49.         DirectDrawEnumerateW_t                  _DirectDrawEnumerateW;
  50.         DllCanUnloadNow_t                               _DllCanUnloadNow;
  51.         DllGetClassObject_t                             _DllGetClassObject;
  52.         GetDDSurfaceLocal_t                             _GetDDSurfaceLocal;
  53.         GetOLEThunkData_t                               _GetOLEThunkData;
  54.         GetSurfaceFromDC_t                              _GetSurfaceFromDC;
  55.         RegisterSpecialCase_t                   _RegisterSpecialCase;
  56.         ReleaseDDThreadLock_t                   _ReleaseDDThreadLock;
  57.         SetAppCompatData_t                              _SetAppCompatData;
  58.  
  59.         HRESULT WINAPI AcquireDDThreadLock(void)
  60.         {
  61.                 return _AcquireDDThreadLock();
  62.         }
  63.  
  64.         HRESULT WINAPI CompleteCreateSysmemSurface(void)
  65.         {
  66.                 return _CompleteCreateSysmemSurface();
  67.         }
  68.  
  69.         HRESULT WINAPI D3DParseUnknownCommand(void)
  70.         {
  71.                 return _D3DParseUnknownCommand();
  72.         }
  73.  
  74.         HRESULT WINAPI DDGetAttachedSurfaceLcl(void)
  75.         {
  76.                 return _DDGetAttachedSurfaceLcl();
  77.         }
  78.  
  79.         HRESULT WINAPI DDInternalLock(void)
  80.         {
  81.                 return _DDInternalLock();
  82.         }
  83.  
  84.         HRESULT WINAPI DDInternalUnlock(void)
  85.         {
  86.                 return _DDInternalUnlock();
  87.         }
  88.  
  89.         HRESULT WINAPI DSoundHelp(void)
  90.         {
  91.                 return _DSoundHelp();
  92.         }
  93.  
  94.         HRESULT WINAPI DirectDrawCreate(
  95.                 GUID FAR                                *lpGUID,
  96.                 LPDIRECTDRAW                    *lplpDD,
  97.                 IUnknown FAR                    *pUnkOuter)
  98.         {
  99.                 return _DirectDrawCreate(lpGUID, lplpDD, pUnkOuter);
  100.         }
  101.  
  102.         HRESULT WINAPI DirectDrawCreateClipper(
  103.                 DWORD                                   dwFlags,
  104.                 LPDIRECTDRAWCLIPPER FAR *lplpDDClipper,
  105.                 IUnknown FAR            *pUnkOuter)
  106.         {
  107.                 return _DirectDrawCreateClipper(dwFlags, lplpDDClipper, pUnkOuter);
  108.         }
  109.  
  110.         HRESULT WINAPI DirectDrawCreateEx(
  111.                 GUID FAR     *lpGUID,
  112.                 LPVOID       *lplpDD,
  113.                 REFIID       iid,
  114.                 IUnknown FAR *pUnkOuter)
  115.         {
  116.                 return _DirectDrawCreateEx(lpGUID, lplpDD, iid, pUnkOuter);
  117.         }
  118.  
  119.         HRESULT WINAPI DirectDrawEnumerateA(void)
  120.         {
  121.                 return _DirectDrawEnumerateA();
  122.         }
  123.  
  124.         HRESULT WINAPI DirectDrawEnumerateExA(
  125.                 LPDDENUMCALLBACKEXA     lpCallback,
  126.                 LPVOID                          lpContext,
  127.                 DWORD               dwFlags)
  128.         {
  129.                 return _DirectDrawEnumerateExA(lpCallback, lpContext, dwFlags);
  130.         }
  131.  
  132.         HRESULT WINAPI DirectDrawEnumerateExW(
  133.                 LPDDENUMCALLBACKEXW     lpCallback,
  134.                 LPVOID                          lpContext,
  135.                 DWORD               dwFlags)
  136.         {
  137.                 return _DirectDrawEnumerateExW(lpCallback, lpContext, dwFlags);
  138.         }
  139.  
  140.         HRESULT WINAPI DirectDrawEnumerateW(
  141.                 LPDDENUMCALLBACKEXW lpCallback,
  142.                 LPVOID                          lpContext)
  143.         {
  144.                 return _DirectDrawEnumerateW(lpCallback, lpContext);
  145.         }
  146.  
  147.         HRESULT WINAPI DllCanUnloadNow(void)
  148.         {
  149.                 return _DllCanUnloadNow();
  150.         }
  151.  
  152.         HRESULT WINAPI DllGetClassObject(
  153.                 const CLSID & rclsid,
  154.                 const IID & riid,
  155.                 void ** ppv)
  156.         {
  157.                 return _DllGetClassObject(rclsid, riid, ppv);
  158.         }
  159.  
  160.         HRESULT WINAPI GetDDSurfaceLocal(void)
  161.         {
  162.                 return _GetDDSurfaceLocal();
  163.         }
  164.  
  165.         HRESULT WINAPI GetOLEThunkData(void)
  166.         {
  167.                 return _GetOLEThunkData();
  168.         }
  169.  
  170.         HRESULT WINAPI GetSurfaceFromDC(void)
  171.         {
  172.                 return _GetSurfaceFromDC();
  173.         }
  174.  
  175.         HRESULT WINAPI RegisterSpecialCase(void)
  176.         {
  177.                 return _RegisterSpecialCase();
  178.         }
  179.  
  180.         HRESULT WINAPI ReleaseDDThreadLock(void)
  181.         {
  182.                 return _ReleaseDDThreadLock();
  183.         }
  184.  
  185.         HRESULT WINAPI SetAppCompatData(void)
  186.         {
  187.                 return _SetAppCompatData();
  188.         }
  189.  
  190.         BOOL Detour__FindFirstFileA(void)
  191.         {
  192.                 static decltype(&FindFirstFileA) _FindFirstFileA = FindFirstFileA;
  193.  
  194.                 decltype(&FindFirstFileA) FindFirstFileA__Hook = [](
  195.                         _In_ LPCSTR lpFileName,
  196.                         _Out_ LPWIN32_FIND_DATAA lpFindFileData) -> HANDLE
  197.                 {
  198.                         for (int i = 0; lpFileName[i] != '\0'; i++)
  199.                                 if (lpFileName[i] == '*')
  200.                                         return INVALID_HANDLE_VALUE;
  201.  
  202.                         return _FindFirstFileA(lpFileName, lpFindFileData);
  203.                 };
  204.  
  205.                 return DetourFunction(TRUE, reinterpret_cast<void**>(&_FindFirstFileA), FindFirstFileA__Hook);
  206.         }
  207.  
  208.         BOOL Initialize(void)
  209.         {
  210.                 TCHAR tszPath[MAX_PATH];
  211.  
  212.                 if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, 0, tszPath)))
  213.                         return FALSE;
  214.  
  215.                 if (!SUCCEEDED(StringCchPrintf(tszPath, MAX_PATH, _T("%s%s"), tszPath, _T("\\ddraw.dll"))))
  216.                         return FALSE;
  217.  
  218.                 HMODULE hModule = LoadLibrary(tszPath);
  219.  
  220.                 if (!hModule)
  221.                         return FALSE;
  222.  
  223.                 _AcquireDDThreadLock = reinterpret_cast<AcquireDDThreadLock_t>(GetProcAddress(hModule, "AcquireDDThreadLock"));
  224.                 _CompleteCreateSysmemSurface = reinterpret_cast<CompleteCreateSysmemSurface_t>(GetProcAddress(hModule, "CompleteCreateSysmemSurface"));
  225.                 _D3DParseUnknownCommand = reinterpret_cast<D3DParseUnknownCommand_t>(GetProcAddress(hModule, "D3DParseUnknownCommand"));
  226.                 _DDGetAttachedSurfaceLcl = reinterpret_cast<DDGetAttachedSurfaceLcl_t>(GetProcAddress(hModule, "DDGetAttachedSurfaceLcl"));
  227.                 _DDInternalLock = reinterpret_cast<DDInternalLock_t>(GetProcAddress(hModule, "DDInternalLock"));
  228.                 _DDInternalUnlock = reinterpret_cast<DDInternalUnlock_t>(GetProcAddress(hModule, "DDInternalUnlock"));
  229.                 _DSoundHelp = reinterpret_cast<DSoundHelp_t>(GetProcAddress(hModule, "DSoundHelp"));
  230.                 _DirectDrawCreate = reinterpret_cast<DirectDrawCreate_t>(GetProcAddress(hModule, "DirectDrawCreate"));
  231.                 _DirectDrawCreateClipper = reinterpret_cast<DirectDrawCreateClipper_t>(GetProcAddress(hModule, "DirectDrawCreateClipper"));
  232.                 _DirectDrawCreateEx = reinterpret_cast<DirectDrawCreateEx_t>(GetProcAddress(hModule, "DirectDrawCreateEx"));
  233.                 _DirectDrawEnumerateA = reinterpret_cast<DirectDrawEnumerateA_t>(GetProcAddress(hModule, "DirectDrawEnumerateA"));
  234.                 _DirectDrawEnumerateExA = reinterpret_cast<DirectDrawEnumerateExA_t>(GetProcAddress(hModule, "DirectDrawEnumerateExA"));
  235.                 _DirectDrawEnumerateExW = reinterpret_cast<DirectDrawEnumerateExW_t>(GetProcAddress(hModule, "DirectDrawEnumerateExW"));
  236.                 _DirectDrawEnumerateW = reinterpret_cast<DirectDrawEnumerateW_t>(GetProcAddress(hModule, "DirectDrawEnumerateW"));
  237.                 _DllCanUnloadNow = reinterpret_cast<DllCanUnloadNow_t>(GetProcAddress(hModule, "DllCanUnloadNow"));
  238.                 _DllGetClassObject = reinterpret_cast<DllGetClassObject_t>(GetProcAddress(hModule, "DllGetClassObject"));
  239.                 _GetDDSurfaceLocal = reinterpret_cast<GetDDSurfaceLocal_t>(GetProcAddress(hModule, "GetDDSurfaceLocal"));
  240.                 _GetOLEThunkData = reinterpret_cast<GetOLEThunkData_t>(GetProcAddress(hModule, "GetOLEThunkData"));
  241.                 _GetSurfaceFromDC = reinterpret_cast<GetSurfaceFromDC_t>(GetProcAddress(hModule, "GetSurfaceFromDC"));
  242.                 _RegisterSpecialCase = reinterpret_cast<RegisterSpecialCase_t>(GetProcAddress(hModule, "RegisterSpecialCase"));
  243.                 _ReleaseDDThreadLock = reinterpret_cast<ReleaseDDThreadLock_t>(GetProcAddress(hModule, "ReleaseDDThreadLock"));
  244.                 _SetAppCompatData = reinterpret_cast<SetAppCompatData_t>(GetProcAddress(hModule, "SetAppCompatData"));
  245.  
  246.                 Detour__FindFirstFileA();
  247.  
  248.                 return TRUE;
  249.         }
  250. }
  251.  
  252. ////////////////////////////////////////////////////////////////////
  253. // =================================================================
  254. // ddraw.def
  255. // =================================================================
  256.  
  257. LIBRARY "ddraw"
  258. EXPORTS
  259.  
  260. AcquireDDThreadLock                     PRIVATE
  261. CompleteCreateSysmemSurface     PRIVATE
  262. D3DParseUnknownCommand          PRIVATE
  263. DDGetAttachedSurfaceLcl         PRIVATE
  264. DDInternalLock                          PRIVATE
  265. DDInternalUnlock                        PRIVATE
  266. DSoundHelp                                      PRIVATE
  267. DirectDrawCreate                        PRIVATE
  268. DirectDrawCreateClipper         PRIVATE
  269. DirectDrawCreateEx                      PRIVATE
  270. DirectDrawEnumerateA            PRIVATE
  271. DirectDrawEnumerateExA          PRIVATE
  272. DirectDrawEnumerateExW          PRIVATE
  273. DirectDrawEnumerateW            PRIVATE
  274. DllCanUnloadNow                         PRIVATE
  275. DllGetClassObject                       PRIVATE
  276. GetDDSurfaceLocal                       PRIVATE
  277. GetOLEThunkData                         PRIVATE
  278. GetSurfaceFromDC                        PRIVATE
  279. RegisterSpecialCase                     PRIVATE
  280. ReleaseDDThreadLock                     PRIVATE
  281. SetAppCompatData                        PRIVATE
  282.  
  283.  
  284.  
  285. ////////////////////////////////////////////////////////////////////
  286. // =================================================================
  287. // ddraw.hpp
  288. // =================================================================
  289.  
  290. #pragma once
  291.  
  292. #include <Windows.h>
  293. #include <d3d.h>
  294.  
  295. namespace ddraw
  296. {
  297.         typedef HRESULT (WINAPI * AcquireDDThreadLock_t)(void);
  298.  
  299.         typedef HRESULT (WINAPI * CompleteCreateSysmemSurface_t)(void);
  300.        
  301.         typedef HRESULT (WINAPI * D3DParseUnknownCommand_t)(void);
  302.        
  303.         typedef HRESULT (WINAPI * DDGetAttachedSurfaceLcl_t)(void);
  304.        
  305.         typedef HRESULT (WINAPI * DDInternalLock_t)(void);
  306.        
  307.         typedef HRESULT (WINAPI * DDInternalUnlock_t)(void);
  308.        
  309.         typedef HRESULT (WINAPI * DSoundHelp_t)(void);
  310.  
  311.         typedef HRESULT (WINAPI * DirectDrawCreate_t)(
  312.                 GUID FAR                        *lpGUID,
  313.                 LPDIRECTDRAW                    *lplpDD,
  314.                 IUnknown FAR                    *pUnkOuter);
  315.  
  316.         typedef HRESULT (WINAPI * DirectDrawCreateClipper_t)(
  317.                 DWORD                   dwFlags,
  318.                 LPDIRECTDRAWCLIPPER FAR *lplpDDClipper,
  319.                 IUnknown FAR            *pUnkOuter);
  320.  
  321.         typedef HRESULT (WINAPI * DirectDrawCreateEx_t)(
  322.                 GUID FAR     *lpGUID,
  323.                 LPVOID       *lplpDD,
  324.                 REFIID       iid,
  325.                 IUnknown FAR *pUnkOuter);
  326.  
  327.         typedef HRESULT (WINAPI * DirectDrawEnumerateA_t)(void);
  328.  
  329.         typedef HRESULT (WINAPI * DirectDrawEnumerateExA_t)(
  330.                 LPDDENUMCALLBACKEXA lpCallback,
  331.                 LPVOID              lpContext,
  332.                 DWORD               dwFlags);
  333.  
  334.         typedef HRESULT (WINAPI * DirectDrawEnumerateExW_t)(
  335.                 LPDDENUMCALLBACKEXW lpCallback,
  336.                 LPVOID              lpContext,
  337.                 DWORD               dwFlags);
  338.  
  339.         typedef HRESULT (WINAPI * DirectDrawEnumerateW_t)(
  340.                 LPDDENUMCALLBACKEXW lpCallback,
  341.                 LPVOID              lpContext);
  342.  
  343.         typedef HRESULT (WINAPI * DllCanUnloadNow_t)(void);
  344.  
  345.         typedef HRESULT (WINAPI * DllGetClassObject_t)(
  346.                 const CLSID & rclsid,
  347.                 const IID & riid,
  348.                 void ** ppv);
  349.  
  350.         typedef HRESULT (WINAPI * GetDDSurfaceLocal_t)(void);
  351.        
  352.         typedef HRESULT (WINAPI * GetOLEThunkData_t)(void);
  353.        
  354.         typedef HRESULT (WINAPI * GetSurfaceFromDC_t)(void);
  355.        
  356.         typedef HRESULT (WINAPI * RegisterSpecialCase_t)(void);
  357.        
  358.         typedef HRESULT (WINAPI * ReleaseDDThreadLock_t)(void);
  359.  
  360.         typedef HRESULT (WINAPI * SetAppCompatData_t)(void);
  361.  
  362.         BOOL Initialize(void);
  363. }
  364.  
  365.  
  366. ////////////////////////////////////////////////////////////////////
  367. // =================================================================
  368. // dllmain.cpp
  369. // =================================================================
  370.  
  371. #include <Windows.h>
  372.  
  373. #include <tchar.h>
  374. #define STRSAFE_NO_DEPRECATE
  375. #include <strsafe.h>
  376.  
  377. #include <Shlwapi.h>
  378. #pragma comment(lib, "Shlwapi.lib")
  379.  
  380. #include "ddraw.h"
  381.  
  382. BOOL WINAPI LoadLibraries()
  383. {
  384.         TCHAR tszTemp[MAX_PATH];
  385.  
  386.         HANDLE hFile;
  387.         WIN32_FIND_DATAW fData;
  388.  
  389.         if (GetCurrentDirectory(MAX_PATH, tszTemp) == 0)
  390.                 return FALSE;
  391.  
  392.         if (!SUCCEEDED(StringCchPrintf(tszTemp, MAX_PATH, _T("%s%s"), tszTemp, _T("\\Loader\\*.dll"))))
  393.                 return FALSE;
  394.  
  395.         hFile = FindFirstFile(tszTemp, &fData);
  396.         if (hFile == INVALID_HANDLE_VALUE)
  397.                 return FALSE;
  398.  
  399.         do
  400.         {
  401.                 if ((fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
  402.                         if (_tcscmp(PathFindExtension(fData.cFileName), _T(".dll")) == 0)
  403.                                 if (SUCCEEDED(StringCchPrintf(tszTemp, MAX_PATH, _T("%s%s"), _T("Loader\\"), fData.cFileName)))
  404.                                         LoadLibrary(tszTemp);
  405.         } while (FindNextFile(hFile, &fData));
  406.  
  407.         return TRUE;
  408. }
  409.  
  410. BOOL WINAPI OnAttachProcess(__in HINSTANCE hInstance)
  411. {
  412.         ddraw::Initialize();
  413.  
  414.         return LoadLibraries();
  415. }
  416.  
  417. BOOL WINAPI DllMain(
  418.         __in HINSTANCE hInstance,
  419.         __in DWORD fdwReason,  
  420.         __reserved LPVOID lpvReserved
  421.         )
  422. {
  423.         UNREFERENCED_PARAMETER(lpvReserved);
  424.  
  425.         switch (fdwReason)
  426.         {
  427.         case DLL_PROCESS_ATTACH:
  428.         {
  429.                 // AllocConsole();
  430.  
  431.                 DisableThreadLibraryCalls(hInstance);
  432.  
  433.                 return OnAttachProcess(hInstance);
  434.         }
  435.         case DLL_PROCESS_DETACH:
  436.         {
  437.                 // FreeLibrary
  438.         }
  439.         }
  440.  
  441.         return TRUE;
  442. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement