From 7e0d508e4bcb966b4e2aca0c709385a5b7914bcf Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Tue, 16 Apr 2024 16:42:41 -0600 Subject: [PATCH 01/16] prolly wont compile just gotta get this out --- srchook/{ntsdlfn.c => delayfnc.c} | 5 +-- srchook/ntshook.h | 3 ++ srchook/srchook.vcxproj | 4 +- srchook/srchook.vcxproj.filters | 8 +++- srchook/usrapihk.c | 35 +++++++++++++++ srchook/usrapihk.h | 72 +++++++++++++++++++++++++++++++ 6 files changed, 121 insertions(+), 6 deletions(-) rename srchook/{ntsdlfn.c => delayfnc.c} (96%) create mode 100644 srchook/usrapihk.c create mode 100644 srchook/usrapihk.h diff --git a/srchook/ntsdlfn.c b/srchook/delayfnc.c similarity index 96% rename from srchook/ntsdlfn.c rename to srchook/delayfnc.c index 8d12a6c..5e0bbe7 100644 --- a/srchook/ntsdlfn.c +++ b/srchook/delayfnc.c @@ -1,5 +1,5 @@ /* * * * * * * *\ - NTSDLFN.C - + DELAYFNC.C - Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - Delay loaded functions, mostly for only testing @@ -14,9 +14,6 @@ #define WIN32_LEAN_AND_MEAN #include -/* Definitions */ -#define STATUS_UNSUCCESSFUL 0xC0000001 - /* Functions */ /* * * *\ diff --git a/srchook/ntshook.h b/srchook/ntshook.h index 5967491..b5812bd 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -16,6 +16,9 @@ /* Includes */ #include +/* Definitions */ +#define STATUS_UNSUCCESSFUL 0xC0000001 + /* Global Variables */ /* Function Prototypes */ diff --git a/srchook/srchook.vcxproj b/srchook/srchook.vcxproj index c7619c9..36ba4dc 100644 --- a/srchook/srchook.vcxproj +++ b/srchook/srchook.vcxproj @@ -200,11 +200,13 @@ + - + + diff --git a/srchook/srchook.vcxproj.filters b/srchook/srchook.vcxproj.filters index 79e453e..406d2bc 100644 --- a/srchook/srchook.vcxproj.filters +++ b/srchook/srchook.vcxproj.filters @@ -30,17 +30,23 @@ Header Files + + Header Files + Source Files - + Source Files Source Files + + Source Files + diff --git a/srchook/usrapihk.c b/srchook/usrapihk.c new file mode 100644 index 0000000..0676ef0 --- /dev/null +++ b/srchook/usrapihk.c @@ -0,0 +1,35 @@ +/* * * * * * * *\ + USRAPIHK.C - + Copyright © 2024 Brady McDermott, Vortesys + DESCRIPTION - + User32 UserApiHook function interface functions + for NT Style. + LICENSE INFORMATION - + MIT License, see LICENSE.txt in the root folder +\* * * * * * * */ + +/* Headers */ +#include "usrapihk.h" +#define WIN32_LEAN_AND_MEAN +#include + +/* Functions */ +BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo) +{ + HMODULE hLib = LoadLibrary(L"user32.dll"); + BOOL bRet = 0; + + if (hLib) + { + FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); + + bRet = (BOOL)fLib(ApiHookInfo); + + FreeLibrary(hLib); + + return bRet; + } + + return FALSE; +} +DWORD CALLBACK UserApiHookProc(UAPIHK State, PUSERAPIHOOK Info); \ No newline at end of file diff --git a/srchook/usrapihk.h b/srchook/usrapihk.h new file mode 100644 index 0000000..801e6cb --- /dev/null +++ b/srchook/usrapihk.h @@ -0,0 +1,72 @@ +/* * * * * * * *\ + USRAPIHK.H - + Copyright © 2024 Brady McDermott, Vortesys + DESCRIPTION - + User32 UserApiHook function prototypes. Info + sourced primarily from the ReactOS wiki and + Mozilla's bug tracker. + LICENSE INFORMATION - + MIT License, see LICENSE.txt in the root folder +\* * * * * * * */ + +/* Pragmas */ +#pragma once + +/* Includes */ +#include + +/* Structures */ +typedef struct _USERAPIHOOKINFO +{ + DWORD m_size; + LPCWSTR m_dllname1; // DLL 1 + LPCWSTR m_funname1; // Callback function + LPCWSTR m_dllname2; // DLL 2 + LPCWSTR m_funname2; // Callback function +} USERAPIHOOKINFO, * PUSERAPIHOOKINFO; + +typedef LRESULT(CALLBACK* WNDPROC_OWP)(HWND, UINT, WPARAM, LPARAM, ULONG_PTR, PDWORD); + +typedef struct _UAHOWP +{ + BYTE* MsgBitArray; + DWORD Size; +} UAHOWP, * PUAHOWP; + +typedef struct tagUSERAPIHOOK +{ + DWORD size; + WNDPROC DefWindowProcA; + WNDPROC DefWindowProcW; + UAHOWP DefWndProcArray; + FARPROC GetScrollInfo; + FARPROC SetScrollInfo; + FARPROC EnableScrollBar; + FARPROC AdjustWindowRectEx; + FARPROC SetWindowRgn; + WNDPROC_OWP PreWndProc; + WNDPROC_OWP PostWndProc; + UAHOWP WndProcArray; + WNDPROC_OWP PreDefDlgProc; + WNDPROC_OWP PostDefDlgProc; + UAHOWP DlgProcArray; + FARPROC GetSystemMetrics; + FARPROC SystemParametersInfoA; + FARPROC SystemParametersInfoW; + FARPROC ForceResetUserApiHook; + FARPROC DrawFrameControl; + FARPROC DrawCaption; + FARPROC MDIRedrawFrame; + FARPROC GetRealWindowOwner; +} USERAPIHOOK, * PUSERAPIHOOK; + +typedef enum _UAPIHK +{ + uahLoadInit, + uahStop, + uahShutdown +} UAPIHK, * PUAPIHK; + +/* Function Prototypes */ +BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo); +DWORD CALLBACK UserApiHookProc(UAPIHK State, PUSERAPIHOOK Info); From 96274b1e53edcea068873a775749cb9c92798288 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Tue, 16 Apr 2024 23:48:14 -0600 Subject: [PATCH 02/16] function names --- src/ntstyle.c | 16 ++++++++-------- src/ntstyle.h | 6 +++--- srchook/ntshook.c | 37 ++++--------------------------------- srchook/ntshook.h | 5 ++--- 4 files changed, 17 insertions(+), 47 deletions(-) diff --git a/src/ntstyle.c b/src/ntstyle.c index 02aa791..c24fde0 100644 --- a/src/ntstyle.c +++ b/src/ntstyle.c @@ -45,7 +45,7 @@ int WINAPI wWinMain( // Create our main window dialog InitCommonControls(); - hDlg = CreateDialogParam(g_hAppInstance, MAKEINTRESOURCE(IDD_MAIN), 0, NTStyleDialogProc, 0); + hDlg = CreateDialogParam(g_hAppInstance, MAKEINTRESOURCE(IDD_MAIN), 0, NtStyleDialogProc, 0); ShowWindow(hDlg, nCmdShow); // Get some system information to determine what @@ -68,10 +68,10 @@ int WINAPI wWinMain( } /* * * *\ - NTStyleCreateHook - + NtStyleCreateHook - NT Style's hook creation function. \* * * */ -DWORD NTStyleCreateHook( +DWORD NtStyleCreateHook( _In_ HINSTANCE hInst, _In_ LPWSTR lpNTStyleHook, _In_ BOOL bDisableTheming, @@ -89,7 +89,7 @@ DWORD NTStyleCreateHook( // Get the hook procedure of NTShook if (hDllInstance) - hkprc = (HOOKPROC)GetProcAddress(hDllInstance, "NTStyleHookProc"); + hkprc = (HOOKPROC)GetProcAddress(hDllInstance, "NtStyleHookProc"); else dwLastError = GetLastError(); @@ -101,7 +101,7 @@ DWORD NTStyleCreateHook( // Enumerate the existing windows and get them dwm-free :fire: if (bDisableTheming) - EnumWindows(&NTStyleEnumWindowProc, (LPARAM)hDllInstance); + EnumWindows(&NtStyleEnumWindowProc, (LPARAM)hDllInstance); if (hDllInstance) FreeLibrary(hDllInstance); @@ -110,17 +110,17 @@ DWORD NTStyleCreateHook( } /* * * *\ - NTStyleEnumWindowProc - + NtStyleEnumWindowProc - NT Style's window enumeration procedure. \* * * */ -BOOL CALLBACK NTStyleEnumWindowProc( +BOOL CALLBACK NtStyleEnumWindowProc( _In_ HWND hwnd, _In_ LPARAM lParam ) { if ((HMODULE)lParam != NULL) { - FARPROC fLib = GetProcAddress((HMODULE)lParam, "NTStyleDisableWindowTheme"); + FARPROC fLib = GetProcAddress((HMODULE)lParam, "NtStyleDisableWindowTheme"); fLib(hwnd); return TRUE; diff --git a/src/ntstyle.h b/src/ntstyle.h index bd28360..8ae9447 100644 --- a/src/ntstyle.h +++ b/src/ntstyle.h @@ -26,7 +26,7 @@ extern BOOL g_bSystem64; /* Function Prototypes */ // NTSTYLE.C -BOOL CALLBACK NTStyleEnumWindowProc(_In_ HWND hwnd, _In_ LPARAM lParam); -DWORD NTStyleCreateHook(_In_ HINSTANCE hInst, _In_ LPWSTR lpNTStyleHook, _In_ BOOL bDisableTheming, _Out_ HHOOK hhkNTShk); +BOOL CALLBACK NtStyleEnumWindowProc(_In_ HWND hwnd, _In_ LPARAM lParam); +DWORD NtStyleCreateHook(_In_ HINSTANCE hInst, _In_ LPWSTR lpNTStyleHook, _In_ BOOL bDisableTheming, _Out_ HHOOK hhkNTShk); // DLGPROC.C -INT_PTR CALLBACK NTStyleDialogProc(_In_ HWND hDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); +INT_PTR CALLBACK NtStyleDialogProc(_In_ HWND hDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); diff --git a/srchook/ntshook.c b/srchook/ntshook.c index b519776..17eb823 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -44,11 +44,11 @@ BOOL APIENTRY DllMain( } /* * * *\ - NTStyleHookProc - + NtStyleHookProc - NT Style Hook procedure Uses WH_CALLWNDPROC. \* * * */ -__declspec(dllexport) LRESULT APIENTRY NTStyleHookProc( +__declspec(dllexport) LRESULT APIENTRY NtStyleHookProc( _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam @@ -65,24 +65,6 @@ __declspec(dllexport) LRESULT APIENTRY NTStyleHookProc( switch (pcwps->message) { - // Drawing Messages - case WM_CREATE: - NTStyleDisableWindowTheme(pcwps->hwnd); - case WM_DISPLAYCHANGE: - case WM_SYNCPAINT: - case WM_ACTIVATE: - case WM_SETTEXT: - case WM_PAINT: - case WM_MOVE: - NTStyleDrawWindow(pcwps->hwnd, pcwps->wParam, pcwps->lParam); - break; - - case WM_NCACTIVATE: - case WM_NCCALCSIZE: - case WM_NCPAINT: - NTStyleDrawWindow(pcwps->hwnd, pcwps->wParam, pcwps->lParam); - return 0; - // Collision Messages /* case WM_NCLBUTTONUP: @@ -110,21 +92,10 @@ __declspec(dllexport) LRESULT APIENTRY NTStyleHookProc( } /* * * *\ - NTStyleSetHook - - NT Style Hook hook so - that we can actually - WOW these programs. -\* * * */ -__declspec(dllexport) HHOOK APIENTRY NTStyleSetHook(_In_ INT idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hmod, _In_ DWORD dwThreadId) -{ - return SetWindowsHookEx(idHook, lpfn, hmod, dwThreadId); -} - -/* * * *\ - NTStyleDisableWindowTheme - + NtStyleDisableWindowTheme - de-themify that window \* * * */ -__declspec(dllexport) VOID APIENTRY NTStyleDisableWindowTheme(_In_ HWND hWnd) +__declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd) { enum DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED; diff --git a/srchook/ntshook.h b/srchook/ntshook.h index b5812bd..9b0ddc0 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -23,11 +23,10 @@ /* Function Prototypes */ // Hook Procedure -__declspec(dllexport) LRESULT APIENTRY NTStyleHookProc(_In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); -__declspec(dllexport) HHOOK APIENTRY NTStyleSetHook(_In_ INT idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hmod, _In_ DWORD dwThreadId); +__declspec(dllexport) LRESULT APIENTRY NtStyleHookProc(_In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); // Functions -__declspec(dllexport) VOID APIENTRY NTStyleDisableWindowTheme(_In_ HWND hWnd); +__declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd); // Delay Load Functions HRESULT DwmGetWindowAttributeDelay(HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute); From 60eccccf58f6b4b7afc659765b70bbe4602391e4 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Tue, 16 Apr 2024 23:49:33 -0600 Subject: [PATCH 03/16] user api hook --- srchook/usrapihk.c | 1 - srchook/usrapihk.h | 1 - 2 files changed, 2 deletions(-) diff --git a/srchook/usrapihk.c b/srchook/usrapihk.c index 0676ef0..32b0941 100644 --- a/srchook/usrapihk.c +++ b/srchook/usrapihk.c @@ -32,4 +32,3 @@ BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo) return FALSE; } -DWORD CALLBACK UserApiHookProc(UAPIHK State, PUSERAPIHOOK Info); \ No newline at end of file diff --git a/srchook/usrapihk.h b/srchook/usrapihk.h index 801e6cb..25c9e04 100644 --- a/srchook/usrapihk.h +++ b/srchook/usrapihk.h @@ -69,4 +69,3 @@ typedef enum _UAPIHK /* Function Prototypes */ BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo); -DWORD CALLBACK UserApiHookProc(UAPIHK State, PUSERAPIHOOK Info); From eb62ad4b7b837feedfc951263b45fbe46d1c39d5 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Tue, 16 Apr 2024 23:50:47 -0600 Subject: [PATCH 04/16] update version --- src/version.inc | Bin 1536 -> 1536 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/version.inc b/src/version.inc index efe56aaa7e5f7d432608df3f3d73b80991aaa142..d9f4b52b35baf98bdab64d41583e1dad27191c2a 100644 GIT binary patch delta 52 zcmZqRY2evV#lmPZxtb-H(P*+Flj>wXRwE$Gku@63mz}(e)r!Z6A%?+#L5YEvfr|kE DRc;F1 delta 52 zcmZqRY2evV#lmPjxtb-H(QvXNlj>wXRwE$Gku@63mz}(e)r!ZEA%?+#L5YEvfr|kE DRNe~M From 6907afd4909b6a761f456c8fb8030625581412d8 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Tue, 16 Apr 2024 23:53:20 -0600 Subject: [PATCH 05/16] update readme since we have builds now --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63aefd5..7fb276b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ NT Style makes your computer look like it's straight out of 1993! Or atleast the Support and compatibility is provided for all versions of Windows NT with kernel version 5.2 and newer. There are currently only compiles for IA-32 and AMD64. ## Where do I get it? -The [releases page](https://github.com/freedom7341/NTStyle/releases/latest) has the latest release of NT Style. +The [releases page](https://github.com/freedom7341/NTStyle/releases/latest) has the latest stable release of NT Style. Builds for every commit can be found in the artifacts of the GitHub actions run of said commit. ## How can I help? Submitting [issues](/issues) and reporting or commenting on bugs that you find is a massive help. The next level is to contribute and create a [pull request](/pulls). From 635fd7fbcb5a5d345b6d6f99e51d9a61054a06d0 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Wed, 17 Apr 2024 00:16:19 -0600 Subject: [PATCH 06/16] FRESH BANNER --- misc/banner.png | Bin 10348 -> 8717 bytes misc/mock2.png | Bin 16032 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 misc/mock2.png diff --git a/misc/banner.png b/misc/banner.png index 0b3dbc0e5f647989b2ec346c942f85a2c5a46a01..b994f5199bad8f8815cfbf4b4257d09d14fdbd8f 100644 GIT binary patch literal 8717 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¡xiYt=ytVr*r~GZ?_UT^T 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 UF Date: Wed, 17 Apr 2024 00:47:30 -0600 Subject: [PATCH 07/16] i'll stop procrastinating now --- README.md | 4 ++-- misc/mock.png | Bin 1429 -> 0 bytes 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 misc/mock.png diff --git a/README.md b/README.md index 7fb276b..8ea775d 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ ![NT Style banner](/misc/banner.png) ## What is NT Style? -NT Style makes your computer look like it's straight out of 1993! Or atleast the titlebars and window borders. Stay tuned. +NT Style makes your computer look like it's straight out of 1993! Using the same method that Stardock's Windowblinds and Microsoft's UxTheme employ, every control and titlebar is turned into something straight from vintage Windows. ## What does it run on? -Support and compatibility is provided for all versions of Windows NT with kernel version 5.2 and newer. There are currently only compiles for IA-32 and AMD64. +Support and compatibility is provided for all versions of Windows NT with kernel version 5.2 and newer. There is currently only support for IA-32 and AMD64 releases. ## Where do I get it? The [releases page](https://github.com/freedom7341/NTStyle/releases/latest) has the latest stable release of NT Style. Builds for every commit can be found in the artifacts of the GitHub actions run of said commit. diff --git a/misc/mock.png b/misc/mock.png deleted file mode 100644 index ea4d5b2c4fab5147a36bb7eaea9a7f876bb3bd2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1429 zcmZXUdo&XY9LE>tF;gC4CR9VX#=PZ{(kwBm=|+T^cM@r7-r4mStuEIi(bDypD6Wy2 z=6QD6^~k)7S{h52kq8}|a(8e2Rp)$uzwh~;^ZVm>e!uhkWuNvqp#Xw{004l(Nf#tW zthwUA%Swpz+g0O4vFy5vIpGATAKJGdHd0~7+>ZeOwBO{n1A$^M7vpmNDgdyX^bd%gnJYDoRrY+IafP3Y_S!H|7Xz~rg%@4<$qK`)4jmli z;kqEU5Qu1}AZC?74ovC7a&1kIs@n)fLQZGW2i;G5R(w^j=|eL!a)i!}N97dJ8ehqC zmT{QUl|iYvs^|pry;j*5gwM0bb_TY#*=3vy5M`af`+E88;Y#}FxL$m=XvXo2MbzNz z#zx`jjAQcS4nzTU%fgr&IUP9hh2$0j;v7lmPXEZNgJI9t+E;n>_c_mL!3O zTXOkoUjX*w+XA(^zUwGRGeTkO19ZLHBXU{g=AX$QLR+~Vr4QTVp;@Hlfte=F&4EK? z3VdYz5Ex(MgP!lg#z|FJS1NVd#QJEq6t8u7?$d(%opKCVHUrJkIVXu+nHfUd~7({m6mp<>(pP*&zlW7B-k~rE#y|qLMcvVNIT&1 z%|LQl7~JsoUN`#WR@gM9HIJ8ckV5o;k;{W-3;R7?S`NN6vGNHl?j5UbB>!$g>5xRN>AEdXwqkrJF=|4%wxMa$Sg4k+@I^bVqr3Iy7`wi3v?FW+|b2oTNzKmcLdTQLyO0y6~){Zs7IY4%| zvt-$E@q$3|G|P1|ZqvAM5_7S6b0P~4&~djyRbE1cuad6J8LU{#I{D4U?6wqI`S z(J+fDV3GRvQTmWomWz9>6OvNyS9N3>;54)e{}Y9NJy3WZu$3sOlVUFwT+>m3*d< zqW>4uIiq?>FDZNq-d{1kW19o4c#3)?nC9AdXOW99=3&6N*jyEX=OoSotYePz5i#P4 z;`VMmKqKDc4#Wx(d}~e8n3aJF+RppNy(8e(XVSBHg{LNVx99BoDaZzaqB>f8H`d@_ zZwUiy&$>Y)K_U@)Mv_Fs?+7yK4rVh@L%Uc@uuG9Ug!5E2@WqTb8dS0d(86@Ih?XJa z{WqQ%KepfUW3d~;3x4Wwmw`9FxH&nRA)(SZerZ0{+>Mqv|Ff&A!j^btsh3=Cvz6!+ z=(UvY+RoiQMQKPNtI_}4v5HStU6p)C7kZ}2br4L8a>Esd-vm7`^VXxM6N@vG;v7rn zL1j~NRHuCG_}nOI#`+JZMa!`#SBAFvZ$764U@D}n_`#ZCZ42IMVUTdJl&AFn^lqtZ zsp`1&mIp!JiS9KMmGoOXu;~-WX#(;qf@{M+r@xl{m{Hq39DC;Hm%`4J_pIE~Ok}`- zA>j@oq}${Z{Y%nOM96m-D3a+gN}lGaz9r&_bewFgXsfH>Ay}6BBV-1)aZcvAlG!9O z#rZ*rDC<*Qj-84Eix{9ZEc2~#$v3wC{wWfB!^nU`HJv2!D+Qc%_CVG Date: Wed, 17 Apr 2024 01:50:31 -0600 Subject: [PATCH 08/16] if the house is a-rockin don't bother knockin --- src/ntstyle.vcxproj.filters | 2 +- srchook/delayfnc.c | 54 +++++++++- srchook/{ntsdrfn.c => draw.c} | 4 +- srchook/{ntsdrfn.h => draw.h} | 2 +- srchook/ntshook.c | 183 ++++++++++++++++++++++++++++++-- srchook/ntshook.def | 9 +- srchook/ntshook.h | 2 + srchook/srchook.vcxproj | 5 +- srchook/srchook.vcxproj.filters | 7 +- srchook/usrapihk.c | 34 ------ srchook/usrapihk.h | 20 +++- srchook/version.inc | Bin 1556 -> 1556 bytes 12 files changed, 261 insertions(+), 61 deletions(-) rename srchook/{ntsdrfn.c => draw.c} (99%) rename srchook/{ntsdrfn.h => draw.h} (99%) delete mode 100644 srchook/usrapihk.c diff --git a/src/ntstyle.vcxproj.filters b/src/ntstyle.vcxproj.filters index bf6d927..72745a8 100644 --- a/src/ntstyle.vcxproj.filters +++ b/src/ntstyle.vcxproj.filters @@ -51,7 +51,7 @@ - Source Files + Resource Files \ No newline at end of file diff --git a/srchook/delayfnc.c b/srchook/delayfnc.c index 5e0bbe7..f9a2eaf 100644 --- a/srchook/delayfnc.c +++ b/srchook/delayfnc.c @@ -4,13 +4,14 @@ DESCRIPTION - Delay loaded functions, mostly for only testing and disabling DWM on systems newer than Windows - Vista. + Vista. Also contains the RegisterUserApiHook. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder \* * * * * * * */ /* Headers */ #include "ntshook.h" +#include "usrapihk.h" #define WIN32_LEAN_AND_MEAN #include @@ -113,3 +114,54 @@ HRESULT SetWindowThemeDelay( return STATUS_UNSUCCESSFUL; } + +/* * * *\ + RegisterUserApiHook - + Registers a DLL and its initialization function + to User32 for theming controls. + RETURNS - + TRUE if successful. +\* * * */ +BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo) +{ + HMODULE hLib = LoadLibrary(L"user32.dll"); + BOOL bRet = 0; + + if (hLib) + { + FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); + + bRet = (BOOL)fLib(ApiHookInfo); + + FreeLibrary(hLib); + + return bRet; + } + + return FALSE; +} + +/* * * *\ + UnregisterUserApiHook - + Unregisters a DLL from User32. + RETURNS - + TRUE if successful. +\* * * */ +BOOL WINAPI UnregisterUserApiHook(VOID) +{ + HMODULE hLib = LoadLibrary(L"user32.dll"); + BOOL bRet = 0; + + if (hLib) + { + FARPROC fLib = GetProcAddress(hLib, "UnregisterUserApiHook"); + + bRet = (BOOL)fLib(); + + FreeLibrary(hLib); + + return bRet; + } + + return FALSE; +} diff --git a/srchook/ntsdrfn.c b/srchook/draw.c similarity index 99% rename from srchook/ntsdrfn.c rename to srchook/draw.c index 92d22ee..41f8e07 100644 --- a/srchook/ntsdrfn.c +++ b/srchook/draw.c @@ -1,5 +1,5 @@ /* * * * * * * *\ - NTSDRFN.C - + DRAW.C - Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - NT Style's drawing functions. @@ -9,7 +9,7 @@ /* Headers */ #include "ntshook.h" -#include "ntsdrfn.h" +#include "draw.h" #include "oebitmap.h" #include diff --git a/srchook/ntsdrfn.h b/srchook/draw.h similarity index 99% rename from srchook/ntsdrfn.h rename to srchook/draw.h index a5a925a..b2047e9 100644 --- a/srchook/ntsdrfn.h +++ b/srchook/draw.h @@ -1,5 +1,5 @@ /* * * * * * * *\ - NTSDRFN.H - + DRAW.H - Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - NT Style's drawing functions. diff --git a/srchook/ntshook.c b/srchook/ntshook.c index 17eb823..2c66e60 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -3,24 +3,27 @@ Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - Defines the entry point for the DLL application. + User hook functions are modeled after the ReactOS + implementation of UxTheme. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder \* * * * * * * */ /* Headers */ #include "ntshook.h" -#include "ntsdrfn.h" +#include "draw.h" +#include "usrapihk.h" #include "resource.h" #include #include #include /* Global Variables */ -static INT g_iSystemHasDWM = 2; -static INT g_iLockUpdateCount; - -// Handles -HINSTANCE g_hDllInstance; +USERAPIHOOK g_user32ApiHook; +BYTE gabDWPmessages[UAHOWP_MAX_SIZE]; +BYTE gabMSGPmessages[UAHOWP_MAX_SIZE]; +BYTE gabDLGPmessages[UAHOWP_MAX_SIZE]; +BOOL g_bThemeHooksActive = FALSE; /* * * *\ DllMain - @@ -65,6 +68,10 @@ __declspec(dllexport) LRESULT APIENTRY NtStyleHookProc( switch (pcwps->message) { + //case WM_CREATE: + // NTStyleDisableWindowTheme(pcwps->hwnd); + // break; + // Collision Messages /* case WM_NCLBUTTONUP: @@ -129,3 +136,167 @@ __declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd) return; } + +/* * * *\ + NtStyleInstallUserHook - + Load the User32 API hook. +\* * * */ +__declspec(dllexport) BOOL CALLBACK NtStyleInstallUserHook() +{ + USERAPIHOOKINFO uah; + + uah.m_size = sizeof(uah); + uah.m_dllname1 = L"ntshk64.dll"; + uah.m_funname1 = L"NtStyleInitUserHook"; + uah.m_dllname2 = NULL; + uah.m_funname2 = NULL; + //uah.m_dllname1 = NULL; + //uah.m_funname1 = NULL; + //uah.m_dllname2 = L"ntshk64.dll"; + //uah.m_funname2 = L"NtStyleInitUserHook"; + + return RegisterUserApiHook(&uah); +} + +/* * * *\ + NtStyleInitUserHook - + Initialize the User32 API hook. +\* * * */ +__declspec(dllexport) BOOL CALLBACK NtStyleInitUserHook(UAPIHK State, PUSERAPIHOOK puah) +{ + // Don't initialize if the state isn't appropriate. + if (!puah || State != uahLoadInit) + { + g_bThemeHooksActive = FALSE; + return TRUE; + } + + /* Store the original functions from user32 */ + g_user32ApiHook = *puah; + + puah->DefWindowProcA = NtStyleDefWindowProcA; + puah->DefWindowProcW = NtStyleDefWindowProcW; + puah->PreWndProc = NtStylePreWindowProc; + puah->PostWndProc = NtStylePostWindowProc; + puah->PreDefDlgProc = NtStyleDlgPreWindowProc; + puah->PostDefDlgProc = NtStyleDlgPostWindowProc; + puah->DefWndProcArray.MsgBitArray = gabDWPmessages; + puah->DefWndProcArray.Size = UAHOWP_MAX_SIZE; + puah->WndProcArray.MsgBitArray = gabMSGPmessages; + puah->WndProcArray.Size = UAHOWP_MAX_SIZE; + puah->DlgProcArray.MsgBitArray = gabDLGPmessages; + puah->DlgProcArray.Size = UAHOWP_MAX_SIZE; + + puah->SetWindowRgn = NtStyleSetWindowRgn; + puah->GetScrollInfo = NtStyleGetScrollInfo; + puah->SetScrollInfo = NtStyleSetScrollInfo; + + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCPAINT); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCACTIVATE); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCMOUSEMOVE); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCMOUSELEAVE); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCHITTEST); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCLBUTTONDOWN); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCUAHDRAWCAPTION); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCUAHDRAWFRAME); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_SETTEXT); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_WINDOWPOSCHANGED); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_CONTEXTMENU); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_STYLECHANGED); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_SETICON); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_NCDESTROY); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_SYSCOMMAND); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_CTLCOLORMSGBOX); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_CTLCOLORBTN); + UAH_HOOK_MESSAGE(puah->DefWndProcArray, WM_CTLCOLORSTATIC); + + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_CREATE); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_SETTINGCHANGE); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_DRAWITEM); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_MEASUREITEM); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_WINDOWPOSCHANGING); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_WINDOWPOSCHANGED); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_STYLECHANGING); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_STYLECHANGED); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_NCCREATE); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_NCDESTROY); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_NCPAINT); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_MENUCHAR); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_MDISETMENU); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_THEMECHANGED); + UAH_HOOK_MESSAGE(puah->WndProcArray, WM_UAHINIT); + + puah->DlgProcArray.MsgBitArray = gabDLGPmessages; + puah->DlgProcArray.Size = UAHOWP_MAX_SIZE; + + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_INITDIALOG); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORMSGBOX); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORBTN); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORDLG); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_CTLCOLORSTATIC); + UAH_HOOK_MESSAGE(puah->DlgProcArray, WM_PRINTCLIENT); + + return TRUE; +} + +/* * * *\ + NtStyleRemoveUserHook - + Initialize the User32 API hook. +\* * * */ +__declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(UAPIHK State, PUSERAPIHOOK pu) +{ + return UnregisterUserApiHook(); +} + +static LRESULT CALLBACK NtStyleDefWindowProcA( + _In_ HWND hWnd, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam) +{ + return g_user32ApiHook.DefWindowProcA(hWnd, Msg, wParam, lParam); +} + +static LRESULT CALLBACK NtStyleDefWindowProcW( + _In_ HWND hWnd, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam) +{ + return g_user32ApiHook.DefWindowProcW(hWnd, Msg, wParam, lParam); +} + +static LRESULT CALLBACK NtStylePreWindowProc() +{ + return 0; +} + +static LRESULT CALLBACK NtStylePostWindowProc() +{ + return 0; +} + +static LRESULT CALLBACK NtStyleDlgPreWindowProc() +{ + return 0; +} + +static LRESULT CALLBACK NtStyleDlgPostWindowProc() +{ + return 0; +} + +static LRESULT CALLBACK NtStyleSetWindowRgn() +{ + return 0; +} + +static LRESULT CALLBACK NtStyleGetScrollInfo() +{ + return 0; +} + +static LRESULT CALLBACK NtStyleSetScrollInfo() +{ + return 0; +} diff --git a/srchook/ntshook.def b/srchook/ntshook.def index babf377..d91cec5 100644 --- a/srchook/ntshook.def +++ b/srchook/ntshook.def @@ -1,5 +1,8 @@ LIBRARY EXPORTS - NTStyleDisableWindowTheme @1 - NTStyleHookProc @2 - NTStyleSetHook @4 \ No newline at end of file + NtStyleDisableWindowTheme @1 + NtStyleHookProc @2 + NtStyleSetHook @4 + NtStyleInstallUserHook @8 + NtStyleInitUserHook @16 + NtStyleRemoveUserHook @32 \ No newline at end of file diff --git a/srchook/ntshook.h b/srchook/ntshook.h index 9b0ddc0..0763a93 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -32,3 +32,5 @@ __declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd); HRESULT DwmGetWindowAttributeDelay(HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute); HRESULT DwmSetWindowAttributeDelay(HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute); HRESULT SetWindowThemeDelay(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList); +BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo); +BOOL WINAPI UnregisterUserApiHook(VOID); diff --git a/srchook/srchook.vcxproj b/srchook/srchook.vcxproj index 36ba4dc..7781b50 100644 --- a/srchook/srchook.vcxproj +++ b/srchook/srchook.vcxproj @@ -196,7 +196,7 @@ - + @@ -204,9 +204,8 @@ - + - diff --git a/srchook/srchook.vcxproj.filters b/srchook/srchook.vcxproj.filters index 406d2bc..c81efbc 100644 --- a/srchook/srchook.vcxproj.filters +++ b/srchook/srchook.vcxproj.filters @@ -27,7 +27,7 @@ Header Files - + Header Files @@ -41,10 +41,7 @@ Source Files - - Source Files - - + Source Files diff --git a/srchook/usrapihk.c b/srchook/usrapihk.c deleted file mode 100644 index 32b0941..0000000 --- a/srchook/usrapihk.c +++ /dev/null @@ -1,34 +0,0 @@ -/* * * * * * * *\ - USRAPIHK.C - - Copyright © 2024 Brady McDermott, Vortesys - DESCRIPTION - - User32 UserApiHook function interface functions - for NT Style. - LICENSE INFORMATION - - MIT License, see LICENSE.txt in the root folder -\* * * * * * * */ - -/* Headers */ -#include "usrapihk.h" -#define WIN32_LEAN_AND_MEAN -#include - -/* Functions */ -BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo) -{ - HMODULE hLib = LoadLibrary(L"user32.dll"); - BOOL bRet = 0; - - if (hLib) - { - FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); - - bRet = (BOOL)fLib(ApiHookInfo); - - FreeLibrary(hLib); - - return bRet; - } - - return FALSE; -} diff --git a/srchook/usrapihk.h b/srchook/usrapihk.h index 25c9e04..a5a2a81 100644 --- a/srchook/usrapihk.h +++ b/srchook/usrapihk.h @@ -3,8 +3,8 @@ Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - User32 UserApiHook function prototypes. Info - sourced primarily from the ReactOS wiki and - Mozilla's bug tracker. + and structures sourced primarily from the ReactOS + wiki, source code and Mozilla's bug tracker. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder \* * * * * * * */ @@ -15,6 +15,19 @@ /* Includes */ #include +/* Definitions */ +#define WM_UAHINIT 0x0000031b +#define WM_UAHDRAWMENU 0x00000091 +#define WM_UAHDRAWITEM 0x00000092 // WM_DRAWITEM +#define WM_UAHINITMENU 0x00000093 +#define WM_UAHMEASUREITEM 0x00000094 // WM_MEASUREITEM +#define WM_UAHDRAWMENUNC 0x00000095 +#define WM_NCUAHDRAWCAPTION 0x000000AE +#define WM_NCUAHDRAWFRAME 0x000000AF +#define UAH_HOOK_MESSAGE(uahowp, msg) uahowp.MsgBitArray[msg/8] |= (1 << (msg % 8)); +#define UAH_IS_MESSAGE_HOOKED(uahowp, msg) (uahowp.MsgBitArray[msg/8] & (1 << (msg % 8))) +#define UAHOWP_MAX_SIZE WM_USER/8 + /* Structures */ typedef struct _USERAPIHOOKINFO { @@ -66,6 +79,3 @@ typedef enum _UAPIHK uahStop, uahShutdown } UAPIHK, * PUAPIHK; - -/* Function Prototypes */ -BOOL WINAPI RegisterUserApiHook(PUSERAPIHOOKINFO ApiHookInfo); diff --git a/srchook/version.inc b/srchook/version.inc index 2540d50311ea7f1ee0f5e94747042cf80cdd6e73..7a9c9172484e96d1fe9e3d18d32f161a76e623fa 100644 GIT binary patch delta 16 XcmbQjGlgeE6Vqf77PZYQm~xl_E^P%8 delta 24 ecmbQjGlgeE6BBy|Lp~5@PYz_3-@Jk;hZz7`HwOOz From 1c602002819c4aa55ac02df0a5aa87cb6505bc16 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Wed, 17 Apr 2024 13:18:10 -0600 Subject: [PATCH 09/16] add user32 stubs --- srchook/ntshook.c | 58 +++++++++++++++++++++++++++++++++++++++-------- srchook/ntshook.h | 7 ++++++ 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/srchook/ntshook.c b/srchook/ntshook.c index 2c66e60..258cea5 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -248,6 +248,10 @@ __declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(UAPIHK State, PUSERAPI return UnregisterUserApiHook(); } +/* * * *\ + NtStyleDefWindowProcA - + User32 stub. +\* * * */ static LRESULT CALLBACK NtStyleDefWindowProcA( _In_ HWND hWnd, _In_ UINT Msg, @@ -257,6 +261,10 @@ static LRESULT CALLBACK NtStyleDefWindowProcA( return g_user32ApiHook.DefWindowProcA(hWnd, Msg, wParam, lParam); } +/* * * *\ + NtStyleDefWindowProcW - + User32 stub. +\* * * */ static LRESULT CALLBACK NtStyleDefWindowProcW( _In_ HWND hWnd, _In_ UINT Msg, @@ -266,37 +274,67 @@ static LRESULT CALLBACK NtStyleDefWindowProcW( return g_user32ApiHook.DefWindowProcW(hWnd, Msg, wParam, lParam); } -static LRESULT CALLBACK NtStylePreWindowProc() +/* * * *\ + NtStylePreWindowProc - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStylePreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown) { return 0; } -static LRESULT CALLBACK NtStylePostWindowProc() +/* * * *\ + NtStylePostWindowProc - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStylePostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown) { return 0; } -static LRESULT CALLBACK NtStyleDlgPreWindowProc() +/* * * *\ + NtStyleDlgPreWindowProc - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStyleDlgPreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown) { return 0; } -static LRESULT CALLBACK NtStyleDlgPostWindowProc() +/* * * *\ + NtStyleDlgPostWindowProc - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStyleDlgPostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown) { return 0; } -static LRESULT CALLBACK NtStyleSetWindowRgn() +/* * * *\ + NtStyleSetWindowRgn - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStyleSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw) { - return 0; + return g_user32ApiHook.SetWindowRgn(hWnd, hRgn, bRedraw); } -static LRESULT CALLBACK NtStyleGetScrollInfo() +/* * * *\ + NtStyleGetScrollInfo - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStyleGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi) { - return 0; + // ReactOS UxTheme tracks the scrollbar itself - if we change the metrics of + // anything then we're going to have to change some stuff up here. + return g_user32ApiHook.GetScrollInfo(hwnd, fnBar, lpsi); } -static LRESULT CALLBACK NtStyleSetScrollInfo() +/* * * *\ + NtStyleSetScrollInfo - + User32 stub. +\* * * */ +static LRESULT CALLBACK NtStyleSetScrollInfo(HWND hWnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw) { - return 0; + return g_user32ApiHook.SetScrollInfo(hWnd, fnBar, lpsi, bRedraw); } diff --git a/srchook/ntshook.h b/srchook/ntshook.h index 0763a93..1a8a28b 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -27,6 +27,13 @@ __declspec(dllexport) LRESULT APIENTRY NtStyleHookProc(_In_ UINT uMsg, _In_ WPAR // Functions __declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd); +static LRESULT CALLBACK NtStyleDefWindowProcA(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); +static LRESULT CALLBACK NtStyleDefWindowProcW(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); +static LRESULT CALLBACK NtStyleDlgPreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); +static LRESULT CALLBACK NtStyleDlgPostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); +static LRESULT CALLBACK NtStyleSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw); +static LRESULT CALLBACK NtStyleGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi); +static LRESULT CALLBACK NtStyleSetScrollInfo(HWND hWnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw); // Delay Load Functions HRESULT DwmGetWindowAttributeDelay(HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute); From b69eaeb59607c5a21d11f54453f47f439712ad03 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Fri, 19 Apr 2024 20:01:34 -0600 Subject: [PATCH 10/16] shuffling n changing n sharing --- {srchook => common}/usrapihk.h | 0 {src => common}/version.inc | Bin 1536 -> 1144 bytes src/ntstyle.c | 64 +++++++++++++++++--------------- src/ntstyle.h | 4 +- src/ntstyle.vcxproj | 5 ++- src/ntstyle.vcxproj.filters | 16 +++++--- src/resource.rc | 6 ++- srchook/delayfnc.c | 2 +- srchook/ntshook.c | 4 +- srchook/ntshook.def | 7 ++-- srchook/ntshook.h | 3 ++ srchook/resource.rc | 8 +++- srchook/srchook.vcxproj | 2 - srchook/srchook.vcxproj.filters | 6 --- srchook/version.inc | Bin 1556 -> 0 bytes 15 files changed, 73 insertions(+), 54 deletions(-) rename {srchook => common}/usrapihk.h (100%) rename {src => common}/version.inc (74%) delete mode 100644 srchook/version.inc diff --git a/srchook/usrapihk.h b/common/usrapihk.h similarity index 100% rename from srchook/usrapihk.h rename to common/usrapihk.h diff --git a/src/version.inc b/common/version.inc similarity index 74% rename from src/version.inc rename to common/version.inc index d9f4b52b35baf98bdab64d41583e1dad27191c2a..377f11f4b6a1d4ba37f164b58ec05fa7a837eeb7 100644 GIT binary patch delta 16 XcmZqR`N6Tlj%jilbHZjdmRpPfGC~EB delta 175 zcmeyt(ZI98j%jioGsnb5Vw0yZ3kfSR_%VbqC@=&wlrU5> #include +/* Variables */ // Handles HINSTANCE g_hAppInstance; HHOOK g_hhkNTShk32 = NULL; @@ -21,7 +23,7 @@ HHOOK g_hhkNTShk64 = NULL; // Strings WCHAR g_szAppTitle[64]; // Other -BOOL g_bSystem64 = TRUE; +BOOL g_bSystem64 = TRUE; /* Functions */ @@ -71,42 +73,46 @@ int WINAPI wWinMain( NtStyleCreateHook - NT Style's hook creation function. \* * * */ -DWORD NtStyleCreateHook( - _In_ HINSTANCE hInst, - _In_ LPWSTR lpNTStyleHook, - _In_ BOOL bDisableTheming, - _Out_ HHOOK hhkNTShk -) +DWORD NtStyleCreateHook() { - HINSTANCE hDllInstance = NULL; - HOOKPROC hkprc = NULL; - DWORD dwLastError = 0; + HMODULE hLib = LoadLibrary(L"ntshk64.dll"); + BOOL bRet = 0; - hhkNTShk = NULL; + if (hLib) + { + FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); - // Load the hook DLL - hDllInstance = LoadLibrary(lpNTStyleHook); + bRet = (BOOL)fLib(ApiHookInfo); - // Get the hook procedure of NTShook - if (hDllInstance) - hkprc = (HOOKPROC)GetProcAddress(hDllInstance, "NtStyleHookProc"); - else - dwLastError = GetLastError(); + FreeLibrary(hLib); - // Establish our hook - if (hkprc) - hhkNTShk = SetWindowsHookEx(WH_CALLWNDPROC, hkprc, hDllInstance, 0); - else - dwLastError = GetLastError(); + return bRet; + } - // Enumerate the existing windows and get them dwm-free :fire: - if (bDisableTheming) - EnumWindows(&NtStyleEnumWindowProc, (LPARAM)hDllInstance); + return FALSE; +} - if (hDllInstance) - FreeLibrary(hDllInstance); +/* * * *\ + NtStyleRemoveHook - + NT Style's hook removal function. +\* * * */ +DWORD NtStyleRemoveHook() +{ + HMODULE hLib = LoadLibrary(L"ntshk64.dll"); + BOOL bRet = 0; - return dwLastError; + if (hLib) + { + FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); + + bRet = (BOOL)fLib(ApiHookInfo); + + FreeLibrary(hLib); + + return bRet; + } + + return FALSE; } /* * * *\ diff --git a/src/ntstyle.h b/src/ntstyle.h index 8ae9447..e9c14c0 100644 --- a/src/ntstyle.h +++ b/src/ntstyle.h @@ -27,6 +27,8 @@ extern BOOL g_bSystem64; /* Function Prototypes */ // NTSTYLE.C BOOL CALLBACK NtStyleEnumWindowProc(_In_ HWND hwnd, _In_ LPARAM lParam); -DWORD NtStyleCreateHook(_In_ HINSTANCE hInst, _In_ LPWSTR lpNTStyleHook, _In_ BOOL bDisableTheming, _Out_ HHOOK hhkNTShk); +DWORD NtStyleCreateHook(); +DWORD NtStyleRemoveHook(); + // DLGPROC.C INT_PTR CALLBACK NtStyleDialogProc(_In_ HWND hDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); diff --git a/src/ntstyle.vcxproj b/src/ntstyle.vcxproj index a785950..f6c2732 100644 --- a/src/ntstyle.vcxproj +++ b/src/ntstyle.vcxproj @@ -168,6 +168,7 @@ + @@ -177,10 +178,10 @@ - + - + diff --git a/src/ntstyle.vcxproj.filters b/src/ntstyle.vcxproj.filters index 72745a8..7c14321 100644 --- a/src/ntstyle.vcxproj.filters +++ b/src/ntstyle.vcxproj.filters @@ -16,6 +16,9 @@ {d681401a-a069-441c-82e8-4bba44ebd993} + + {5de2b196-5c95-4426-b53a-6e9402331a6b} + @@ -32,6 +35,9 @@ Header Files + + Common Files + @@ -44,14 +50,14 @@ Resource Files\en-US - - - Resource Files - - Resource Files + + + Common Files + + \ No newline at end of file diff --git a/src/resource.rc b/src/resource.rc index ff2d190..dc8952c 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -24,7 +24,11 @@ IDI_MAIN ICON icons\ntstyle.ico /* Version Information */ #define APSTUDIO_HIDDEN_SYMBOLS -#include "version.inc" +#define VER_FILEDESCRIPTION_STR "NT Style" +#define VER_INTERNALNAME_STR "ntstyle\0" +#define VER_ORIGINALFILENAME_STR "NTSTYLE.EXE" +#define VER_PRODUCTNAME_STR "NT Style" +#include "..\common\version.inc" #undef APSTUDIO_HIDDEN_SYMBOLS VS_VERSION_INFO VERSIONINFO diff --git a/srchook/delayfnc.c b/srchook/delayfnc.c index f9a2eaf..6874e95 100644 --- a/srchook/delayfnc.c +++ b/srchook/delayfnc.c @@ -11,7 +11,7 @@ /* Headers */ #include "ntshook.h" -#include "usrapihk.h" +#include "..\common\usrapihk.h" #define WIN32_LEAN_AND_MEAN #include diff --git a/srchook/ntshook.c b/srchook/ntshook.c index 258cea5..f6027a0 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -12,7 +12,7 @@ /* Headers */ #include "ntshook.h" #include "draw.h" -#include "usrapihk.h" +#include "..\common\usrapihk.h" #include "resource.h" #include #include @@ -243,7 +243,7 @@ __declspec(dllexport) BOOL CALLBACK NtStyleInitUserHook(UAPIHK State, PUSERAPIHO NtStyleRemoveUserHook - Initialize the User32 API hook. \* * * */ -__declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(UAPIHK State, PUSERAPIHOOK pu) +__declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook() { return UnregisterUserApiHook(); } diff --git a/srchook/ntshook.def b/srchook/ntshook.def index d91cec5..7594e8b 100644 --- a/srchook/ntshook.def +++ b/srchook/ntshook.def @@ -2,7 +2,6 @@ LIBRARY EXPORTS NtStyleDisableWindowTheme @1 NtStyleHookProc @2 - NtStyleSetHook @4 - NtStyleInstallUserHook @8 - NtStyleInitUserHook @16 - NtStyleRemoveUserHook @32 \ No newline at end of file + NtStyleInstallUserHook @4 + NtStyleInitUserHook @8 + NtStyleRemoveUserHook @16 \ No newline at end of file diff --git a/srchook/ntshook.h b/srchook/ntshook.h index 1a8a28b..a5d42a9 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -27,6 +27,9 @@ __declspec(dllexport) LRESULT APIENTRY NtStyleHookProc(_In_ UINT uMsg, _In_ WPAR // Functions __declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd); +__declspec(dllexport) BOOL CALLBACK NtStyleInstallUserHook(); +__declspec(dllexport) BOOL CALLBACK NtStyleInitUserHook(UAPIHK State, PUSERAPIHOOK puah); +__declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(); static LRESULT CALLBACK NtStyleDefWindowProcA(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); static LRESULT CALLBACK NtStyleDefWindowProcW(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); static LRESULT CALLBACK NtStyleDlgPreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); diff --git a/srchook/resource.rc b/srchook/resource.rc index 869006d..3b87a68 100644 --- a/srchook/resource.rc +++ b/srchook/resource.rc @@ -11,6 +11,7 @@ #define APSTUDIO_HIDDEN_SYMBOLS #include #include "resource.h" +#undef APSTUDIO_HIDDEN_SYMBOLS /* Bitmaps */ IDB_MAX BITMAP images\max.bmp @@ -22,7 +23,12 @@ IDB_RES_S BITMAP images\resd.bmp IDB_MENU BITMAP images\menu.bmp /* Version Information */ -#include "version.inc" +#define APSTUDIO_HIDDEN_SYMBOLS +#define VER_FILEDESCRIPTION_STR "NT Style Hook" +#define VER_INTERNALNAME_STR "ntshook\0" +#define VER_ORIGINALFILENAME_STR "NTSHOOK.DLL" +#define VER_PRODUCTNAME_STR "NT Style Hook" +#include "..\common\version.inc" #undef APSTUDIO_HIDDEN_SYMBOLS VS_VERSION_INFO VERSIONINFO diff --git a/srchook/srchook.vcxproj b/srchook/srchook.vcxproj index 7781b50..da6e9bf 100644 --- a/srchook/srchook.vcxproj +++ b/srchook/srchook.vcxproj @@ -200,7 +200,6 @@ - @@ -212,7 +211,6 @@ - diff --git a/srchook/srchook.vcxproj.filters b/srchook/srchook.vcxproj.filters index c81efbc..3019ab1 100644 --- a/srchook/srchook.vcxproj.filters +++ b/srchook/srchook.vcxproj.filters @@ -30,9 +30,6 @@ Header Files - - Header Files - @@ -51,9 +48,6 @@ - - Resource Files - Export Definitions diff --git a/srchook/version.inc b/srchook/version.inc deleted file mode 100644 index 7a9c9172484e96d1fe9e3d18d32f161a76e623fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1556 zcma)+-EP`I5QWceD&-wk?oEqYf>2+80!geIgD^#kgcL;yNvh_j0;_5tsV~{~n=wuZ zF$P&{?|NtEoHH}K|Nb7Sp-?ksI@B8-DAhz6<4lSAYO0IZ$JO2et4ICNZ!PpqH@a2M z?jJ^5EygEipV_<66*fTwU8<)!f9~RqP&U8S%%8H3C1@5H9Q3 z$6(&!74*|%E?Gb7f%UaV49-0eB`2;~HlKJmTzN{&0HZz#eXMPkf*CuuWv8+7Nch+F z-Hdl&mFgJpF`7D+>;~9OuuNce3HAfZ=C0Si#`fx2_K=rojT9~F0YKr`w60fQ%5sY5n5$`w?@4m1aA Date: Fri, 19 Apr 2024 20:21:23 -0600 Subject: [PATCH 11/16] she builds again --- src/dlgproc.c | 54 +++++++++++++++++++---------------------------- src/ntstyle.c | 36 ++++++++----------------------- src/ntstyle.h | 3 +-- srchook/ntshook.h | 3 +++ 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/src/dlgproc.c b/src/dlgproc.c index 5d60137..f1dffbc 100644 --- a/src/dlgproc.c +++ b/src/dlgproc.c @@ -17,10 +17,10 @@ /* Functions */ /* * * *\ - NTStyleDialogProc - + NtStyleDialogProc - NT Style's dialog procedure. \* * * */ -INT_PTR CALLBACK NTStyleDialogProc( +INT_PTR CALLBACK NtStyleDialogProc( _In_ HWND hDlg, _In_ UINT uMsg, _In_ WPARAM wParam, @@ -41,44 +41,34 @@ INT_PTR CALLBACK NTStyleDialogProc( case IDC_START: { - DWORD dwLastError = 0; - - if (g_bSystem64) - dwLastError = NTStyleCreateHook(g_hAppInstance, L"ntshk64.dll", - (Button_GetCheck(GetDlgItem(hDlg, IDC_THEMEOFF)) == BST_CHECKED), g_hhkNTShk64); - - // load that 32 bit ish - dwLastError = NTStyleCreateHook(g_hAppInstance, L"ntshk32.dll", - (Button_GetCheck(GetDlgItem(hDlg, IDC_THEMEOFF)) == BST_CHECKED), g_hhkNTShk32); + if (NtStyleToggleHook(TRUE)) + { + MessageBox(hDlg, L"Started NT Style.", L"NT Style (AMD64)", + MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); - if (g_hhkNTShk32 || g_hhkNTShk64) + Button_Enable(GetDlgItem(hDlg, IDC_START), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_STOP), TRUE); + } + else { - // Start NT Style - if (!g_hhkNTShk32) - MessageBox(hDlg, L"Started NT Style.", L"NT Style (AMD64)", - MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); - else if (!g_hhkNTShk64) - MessageBox(hDlg, L"Started NT Style.", L"NT Style (IA32)", - MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); - else - MessageBox(hDlg, L"Started NT Style.", L"NT Style (AMD64 + WOW)", - MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); + MessageBox(hDlg, L"Failed to start NT Style.", L"NT Style (AMD64)", + MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); } - Button_Enable(GetDlgItem(hDlg, IDC_START), FALSE); - Button_Enable(GetDlgItem(hDlg, IDC_STOP), TRUE); - return 0; } case IDC_STOP: - if (g_hhkNTShk32) - UnhookWindowsHookEx(g_hhkNTShk32); - if (g_hhkNTShk64) - UnhookWindowsHookEx(g_hhkNTShk64); - - Button_Enable(GetDlgItem(hDlg, IDC_START), TRUE); - Button_Enable(GetDlgItem(hDlg, IDC_STOP), FALSE); + if (NtStyleToggleHook(FALSE)) + { + Button_Enable(GetDlgItem(hDlg, IDC_START), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_STOP), TRUE); + } + else + { + MessageBox(hDlg, L"Failed to stop NT Style.", L"NT Style (AMD64)", + MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); + } return 0; } diff --git a/src/ntstyle.c b/src/ntstyle.c index 845b186..ff03b78 100644 --- a/src/ntstyle.c +++ b/src/ntstyle.c @@ -70,42 +70,24 @@ int WINAPI wWinMain( } /* * * *\ - NtStyleCreateHook - - NT Style's hook creation function. + NtStyleToggleHook - + NT Style's hook creation and removal function. \* * * */ -DWORD NtStyleCreateHook() +BOOL NtStyleToggleHook(BOOL bInstall) { HMODULE hLib = LoadLibrary(L"ntshk64.dll"); BOOL bRet = 0; if (hLib) { - FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); + FARPROC fLib; - bRet = (BOOL)fLib(ApiHookInfo); + if (bInstall) + fLib = GetProcAddress(hLib, "NtStyleInstallUserHook"); + else + fLib = GetProcAddress(hLib, "NtStyleRemoveUserHook"); - FreeLibrary(hLib); - - return bRet; - } - - return FALSE; -} - -/* * * *\ - NtStyleRemoveHook - - NT Style's hook removal function. -\* * * */ -DWORD NtStyleRemoveHook() -{ - HMODULE hLib = LoadLibrary(L"ntshk64.dll"); - BOOL bRet = 0; - - if (hLib) - { - FARPROC fLib = GetProcAddress(hLib, "RegisterUserApiHook"); - - bRet = (BOOL)fLib(ApiHookInfo); + bRet = (BOOL)fLib(); FreeLibrary(hLib); diff --git a/src/ntstyle.h b/src/ntstyle.h index e9c14c0..05c1565 100644 --- a/src/ntstyle.h +++ b/src/ntstyle.h @@ -27,8 +27,7 @@ extern BOOL g_bSystem64; /* Function Prototypes */ // NTSTYLE.C BOOL CALLBACK NtStyleEnumWindowProc(_In_ HWND hwnd, _In_ LPARAM lParam); -DWORD NtStyleCreateHook(); -DWORD NtStyleRemoveHook(); +BOOL NtStyleToggleHook(BOOL bInstall); // DLGPROC.C INT_PTR CALLBACK NtStyleDialogProc(_In_ HWND hDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); diff --git a/srchook/ntshook.h b/srchook/ntshook.h index a5d42a9..7415a23 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -15,6 +15,7 @@ /* Includes */ #include +#include "..\common\usrapihk.h" /* Definitions */ #define STATUS_UNSUCCESSFUL 0xC0000001 @@ -32,6 +33,8 @@ __declspec(dllexport) BOOL CALLBACK NtStyleInitUserHook(UAPIHK State, PUSERAPIHO __declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(); static LRESULT CALLBACK NtStyleDefWindowProcA(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); static LRESULT CALLBACK NtStyleDefWindowProcW(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); +static LRESULT CALLBACK NtStylePreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); +static LRESULT CALLBACK NtStylePostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); static LRESULT CALLBACK NtStyleDlgPreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); static LRESULT CALLBACK NtStyleDlgPostWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); static LRESULT CALLBACK NtStyleSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw); From 0fe0bd1db0d24c37fafc532f352321428e34842b Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Sat, 20 Apr 2024 11:22:51 -0600 Subject: [PATCH 12/16] suffer...... --- src/dlgproc.c | 8 +-- srchook/delayfnc.c | 2 +- srchook/draw.c | 2 +- srchook/ntshook.c | 142 ++++++++++++++++++++++++-------------------- srchook/ntshook.def | 7 +-- srchook/ntshook.h | 9 +-- 6 files changed, 93 insertions(+), 77 deletions(-) diff --git a/src/dlgproc.c b/src/dlgproc.c index f1dffbc..bd59b92 100644 --- a/src/dlgproc.c +++ b/src/dlgproc.c @@ -5,7 +5,7 @@ NT Style's primary dialog procedures. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder - \* * * * * * * */ +\* * * * * * * */ /* Headers */ #include "ntstyle.h" @@ -43,7 +43,7 @@ INT_PTR CALLBACK NtStyleDialogProc( { if (NtStyleToggleHook(TRUE)) { - MessageBox(hDlg, L"Started NT Style.", L"NT Style (AMD64)", + MessageBox(hDlg, L"Started NT Style.", L"NT Style", MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); Button_Enable(GetDlgItem(hDlg, IDC_START), FALSE); @@ -51,7 +51,7 @@ INT_PTR CALLBACK NtStyleDialogProc( } else { - MessageBox(hDlg, L"Failed to start NT Style.", L"NT Style (AMD64)", + MessageBox(hDlg, L"Failed to start NT Style.", L"NT Style", MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); } @@ -66,7 +66,7 @@ INT_PTR CALLBACK NtStyleDialogProc( } else { - MessageBox(hDlg, L"Failed to stop NT Style.", L"NT Style (AMD64)", + MessageBox(hDlg, L"Failed to stop NT Style.", L"NT Style", MB_OK | MB_ICONINFORMATION | MB_DEFAULT_DESKTOP_ONLY); } diff --git a/srchook/delayfnc.c b/srchook/delayfnc.c index 6874e95..e832e3c 100644 --- a/srchook/delayfnc.c +++ b/srchook/delayfnc.c @@ -7,7 +7,7 @@ Vista. Also contains the RegisterUserApiHook. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder - \* * * * * * * */ +\* * * * * * * */ /* Headers */ #include "ntshook.h" diff --git a/srchook/draw.c b/srchook/draw.c index 41f8e07..534c47a 100644 --- a/srchook/draw.c +++ b/srchook/draw.c @@ -5,7 +5,7 @@ NT Style's drawing functions. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder - \* * * * * * * */ +\* * * * * * * */ /* Headers */ #include "ntshook.h" diff --git a/srchook/ntshook.c b/srchook/ntshook.c index f6027a0..b0f2580 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -7,7 +7,7 @@ implementation of UxTheme. LICENSE INFORMATION - MIT License, see LICENSE.txt in the root folder - \* * * * * * * */ +\* * * * * * * */ /* Headers */ #include "ntshook.h" @@ -46,58 +46,6 @@ BOOL APIENTRY DllMain( return TRUE; } -/* * * *\ - NtStyleHookProc - - NT Style Hook procedure - Uses WH_CALLWNDPROC. -\* * * */ -__declspec(dllexport) LRESULT APIENTRY NtStyleHookProc( - _In_ UINT uMsg, - _In_ WPARAM wParam, - _In_ LPARAM lParam -) -{ - PCWPSTRUCT pcwps; - - // Switch case for window painting - switch (uMsg) - { - /* BEGIN HC_ACTION */ - case HC_ACTION: - pcwps = (CWPSTRUCT*)lParam; - - switch (pcwps->message) - { - //case WM_CREATE: - // NTStyleDisableWindowTheme(pcwps->hwnd); - // break; - - // Collision Messages - /* - case WM_NCLBUTTONUP: - break; - - case WM_NCLBUTTONDBLCLK: - break; - - case WM_NCRBUTTONUP: - break; - - case WM_NCHITTEST: - break;*/ - - default: - break; - } - /* END HC_ACTION */ - - default: - break; - } - - return CallNextHookEx(NULL, uMsg, wParam, lParam); -} - /* * * *\ NtStyleDisableWindowTheme - de-themify that window @@ -146,14 +94,10 @@ __declspec(dllexport) BOOL CALLBACK NtStyleInstallUserHook() USERAPIHOOKINFO uah; uah.m_size = sizeof(uah); - uah.m_dllname1 = L"ntshk64.dll"; - uah.m_funname1 = L"NtStyleInitUserHook"; - uah.m_dllname2 = NULL; - uah.m_funname2 = NULL; - //uah.m_dllname1 = NULL; - //uah.m_funname1 = NULL; - //uah.m_dllname2 = L"ntshk64.dll"; - //uah.m_funname2 = L"NtStyleInitUserHook"; + uah.m_dllname1 = NULL; + uah.m_funname1 = NULL; + uah.m_dllname2 = L"ntshk64.dll"; + uah.m_funname2 = L"NtStyleInitUserHook"; return RegisterUserApiHook(&uah); } @@ -258,7 +202,7 @@ static LRESULT CALLBACK NtStyleDefWindowProcA( _In_ WPARAM wParam, _In_ LPARAM lParam) { - return g_user32ApiHook.DefWindowProcA(hWnd, Msg, wParam, lParam); + return NtStyleWndProc(hWnd, Msg, wParam, lParam, g_user32ApiHook.DefWindowProcA); } /* * * *\ @@ -271,7 +215,7 @@ static LRESULT CALLBACK NtStyleDefWindowProcW( _In_ WPARAM wParam, _In_ LPARAM lParam) { - return g_user32ApiHook.DefWindowProcW(hWnd, Msg, wParam, lParam); + return NtStyleWndProc(hWnd, Msg, wParam, lParam, g_user32ApiHook.DefWindowProcW); } /* * * *\ @@ -280,6 +224,14 @@ static LRESULT CALLBACK NtStyleDefWindowProcW( \* * * */ static LRESULT CALLBACK NtStylePreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown) { + // TODO: SET/CHECK/MODIFY WINDOW REGION - ELIMINATE UGLY BASIC CORNERS!!! + switch (Msg) + { + case WM_CREATE: + NtStyleDisableWindowTheme(hWnd); + break; + } + return 0; } @@ -338,3 +290,67 @@ static LRESULT CALLBACK NtStyleSetScrollInfo(HWND hWnd, int fnBar, LPCSCROLLINFO { return g_user32ApiHook.SetScrollInfo(hWnd, fnBar, lpsi, bRedraw); } + +/* * * *\ + NtStyleWndProc - + NT Style's Window Procedure functions. +\* * * */ +LRESULT CALLBACK NtStyleWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, WNDPROC DefWndProc) +{ + switch (Msg) + { + case WM_NCPAINT: + // + // WM_NCUAHDRAWCAPTION : wParam are DC_* flags. + // + case WM_NCUAHDRAWCAPTION: + // + // WM_NCUAHDRAWFRAME : wParam is HDC, lParam are DC_ACTIVE and or DC_REDRAWHUNGWND. + // + case WM_NCUAHDRAWFRAME: + case WM_NCACTIVATE: + //if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) != WS_CAPTION) + //return TRUE; + //return TRUE; + case WM_NCMOUSEMOVE: + case WM_NCMOUSELEAVE: + case WM_NCLBUTTONDOWN: + //switch (wParam) + //{ + //case HTMINBUTTON: + //case HTMAXBUTTON: + //case HTCLOSE: + //{ + //ThemeHandleButton(hWnd, wParam); + //return 0; + //} + //default: + //return DefWndProc(hWnd, Msg, wParam, lParam); + //} + //case WM_NCHITTEST: + //{ + //POINT Point; + //Point.x = GET_X_LPARAM(lParam); + //Point.y = GET_Y_LPARAM(lParam); + //return DefWndNCHitTest(hWnd, Point); + //} + case WM_SYSCOMMAND: + //{ + //if ((wParam & 0xfff0) == SC_VSCROLL || + //(wParam & 0xfff0) == SC_HSCROLL) + //{ + //POINT Pt; + //Pt.x = (short)LOWORD(lParam); + //Pt.y = (short)HIWORD(lParam); + //NC_TrackScrollBar(hWnd, wParam, Pt); + //return 0; + //} + //else + //{ + return DefWndProc(hWnd, Msg, wParam, lParam); + //} + //} + default: + return DefWndProc(hWnd, Msg, wParam, lParam); + } +} diff --git a/srchook/ntshook.def b/srchook/ntshook.def index 7594e8b..1fba138 100644 --- a/srchook/ntshook.def +++ b/srchook/ntshook.def @@ -1,7 +1,6 @@ LIBRARY EXPORTS NtStyleDisableWindowTheme @1 - NtStyleHookProc @2 - NtStyleInstallUserHook @4 - NtStyleInitUserHook @8 - NtStyleRemoveUserHook @16 \ No newline at end of file + NtStyleInstallUserHook @2 + NtStyleInitUserHook @4 + NtStyleRemoveUserHook @8 \ No newline at end of file diff --git a/srchook/ntshook.h b/srchook/ntshook.h index 7415a23..d60d722 100644 --- a/srchook/ntshook.h +++ b/srchook/ntshook.h @@ -23,14 +23,14 @@ /* Global Variables */ /* Function Prototypes */ -// Hook Procedure -__declspec(dllexport) LRESULT APIENTRY NtStyleHookProc(_In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); - -// Functions __declspec(dllexport) VOID APIENTRY NtStyleDisableWindowTheme(_In_ HWND hWnd); + +// Hook Functions __declspec(dllexport) BOOL CALLBACK NtStyleInstallUserHook(); __declspec(dllexport) BOOL CALLBACK NtStyleInitUserHook(UAPIHK State, PUSERAPIHOOK puah); __declspec(dllexport) BOOL CALLBACK NtStyleRemoveUserHook(); + +// Window Management static LRESULT CALLBACK NtStyleDefWindowProcA(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); static LRESULT CALLBACK NtStyleDefWindowProcW(_In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam); static LRESULT CALLBACK NtStylePreWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, ULONG_PTR ret, PDWORD unknown); @@ -40,6 +40,7 @@ static LRESULT CALLBACK NtStyleDlgPostWindowProc(HWND hWnd, UINT Msg, WPARAM wPa static LRESULT CALLBACK NtStyleSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw); static LRESULT CALLBACK NtStyleGetScrollInfo(HWND hwnd, int fnBar, LPSCROLLINFO lpsi); static LRESULT CALLBACK NtStyleSetScrollInfo(HWND hWnd, int fnBar, LPCSCROLLINFO lpsi, BOOL bRedraw); +LRESULT CALLBACK NtStyleWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, WNDPROC DefWndProc); // Delay Load Functions HRESULT DwmGetWindowAttributeDelay(HWND hwnd, DWORD dwAttribute, _In_ LPCVOID pvAttribute, DWORD cbAttribute); From 81c095a5471ef6847acd6897d7931a0ce42dc9cb Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Fri, 26 Apr 2024 00:06:05 -0600 Subject: [PATCH 13/16] Update resource.rc --- src/resource.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resource.rc b/src/resource.rc index dc8952c..bf58334 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -1,5 +1,5 @@ /* * * * * * * *\ - NTSTYLE.C - + RESOURCE.RC - Copyright © 2024 Brady McDermott, Vortesys DESCRIPTION - This file contains NT Style's resources. From 7a1bcf8a1b2937bd28e6c82bb6b9457664f85aa3 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Wed, 1 May 2024 20:51:35 -0600 Subject: [PATCH 14/16] comments --- common/version.inc | Bin 1144 -> 1148 bytes src/resource.rc | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/common/version.inc b/common/version.inc index 377f11f4b6a1d4ba37f164b58ec05fa7a837eeb7..f2540d75c7e189b31abeeec31278c5588d91f1fb 100644 GIT binary patch delta 30 kcmeyt@rPrAmT(w@D?<=NFoP$9KZ75G9+39iXlc&^0DQCt>Hq)$ delta 26 gcmeyv@q=T67QY`u2tzOsM>6;@xH9N%w6$je0A(}=U;qFB diff --git a/src/resource.rc b/src/resource.rc index bf58334..f53a61f 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -24,7 +24,7 @@ IDI_MAIN ICON icons\ntstyle.ico /* Version Information */ #define APSTUDIO_HIDDEN_SYMBOLS -#define VER_FILEDESCRIPTION_STR "NT Style" +#define VER_FILEDESCRIPTION_STR "NT Style theming utility for Windows." #define VER_INTERNALNAME_STR "ntstyle\0" #define VER_ORIGINALFILENAME_STR "NTSTYLE.EXE" #define VER_PRODUCTNAME_STR "NT Style" From bb00fb93767cabc884f704468aaeb3ffb539a66d Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Wed, 1 May 2024 20:51:44 -0600 Subject: [PATCH 15/16] fix a prototype, ros got it wrong? --- common/usrapihk.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/usrapihk.h b/common/usrapihk.h index a5a2a81..9ac61c7 100644 --- a/common/usrapihk.h +++ b/common/usrapihk.h @@ -32,10 +32,10 @@ typedef struct _USERAPIHOOKINFO { DWORD m_size; - LPCWSTR m_dllname1; // DLL 1 LPCWSTR m_funname1; // Callback function - LPCWSTR m_dllname2; // DLL 2 + LPCWSTR m_dllname1; // DLL 1 LPCWSTR m_funname2; // Callback function + LPCWSTR m_dllname2; // DLL 2 } USERAPIHOOKINFO, * PUSERAPIHOOKINFO; typedef LRESULT(CALLBACK* WNDPROC_OWP)(HWND, UINT, WPARAM, LPARAM, ULONG_PTR, PDWORD); From 977dbee41dabb7d14188cff8eee0b05ee4204be0 Mon Sep 17 00:00:00 2001 From: Brady McDermott Date: Fri, 17 May 2024 23:15:02 -0600 Subject: [PATCH 16/16] i don even kno --- common/usrapihk.h | 1 - srchook/images/g96max.bmp | Bin 0 -> 334 bytes srchook/images/g96menu.bmp | Bin 0 -> 334 bytes srchook/images/g96min.bmp | Bin 0 -> 334 bytes srchook/images/g96mmenu.bmp | Bin 0 -> 478 bytes srchook/images/g96res.bmp | Bin 0 -> 334 bytes srchook/images/max.bmp | Bin 334 -> 334 bytes srchook/images/maxd.bmp | Bin 334 -> 334 bytes srchook/images/min.bmp | Bin 334 -> 334 bytes srchook/images/mind.bmp | Bin 334 -> 334 bytes srchook/images/mock.bmp | Bin 0 -> 153718 bytes srchook/images/res.bmp | Bin 334 -> 334 bytes srchook/images/resd.bmp | Bin 334 -> 334 bytes srchook/ntshook.c | 7 +++---- 14 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 srchook/images/g96max.bmp create mode 100644 srchook/images/g96menu.bmp create mode 100644 srchook/images/g96min.bmp create mode 100644 srchook/images/g96mmenu.bmp create mode 100644 srchook/images/g96res.bmp create mode 100644 srchook/images/mock.bmp diff --git a/common/usrapihk.h b/common/usrapihk.h index 9ac61c7..702325c 100644 --- a/common/usrapihk.h +++ b/common/usrapihk.h @@ -31,7 +31,6 @@ /* Structures */ typedef struct _USERAPIHOOKINFO { - DWORD m_size; LPCWSTR m_funname1; // Callback function LPCWSTR m_dllname1; // DLL 1 LPCWSTR m_funname2; // Callback function diff --git a/srchook/images/g96max.bmp b/srchook/images/g96max.bmp new file mode 100644 index 0000000000000000000000000000000000000000..72bb0ae2b73daa6621d4b4d811ee4ad00672b77c GIT binary patch literal 334 zcma)#!3hFE3`PHfptk|5unzB9j=RU)cFLMEEW-}sOJ+v|Ma(3B9zP^GU#^ofZs>_R zZZ&C_{yp`Zm_*8~e<(_&FD#^vz#mvYd7Wpv-Iw++F8&uY9J8jv*`@C( ZoM$+9n)_oJ``>q3*xTKD00#&D;wOdAXf*%; literal 0 HcmV?d00001 diff --git a/srchook/images/g96menu.bmp b/srchook/images/g96menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f84c93b1aa9dbc8915d9b993acf34d7b3e184d82 GIT binary patch literal 334 zcmbu3u?>JQ3Sztc<}n=HlRvE+7Br^^xA$_9KboL|3?cOfq=> zxc-TXFrwNn6bn^KDLj~um{kWkH9~TLJZ$du_vP>&y1?juW}{j2EuXq~#i!{DTRUH0 CC1z6q literal 0 HcmV?d00001 diff --git a/srchook/images/g96min.bmp b/srchook/images/g96min.bmp new file mode 100644 index 0000000000000000000000000000000000000000..062e5c95c50c3fc4ebb018bd0d3192c7151b9b25 GIT binary patch literal 334 zcmZ{fu@S={3`M{1d`CL&oFy_x`ec?=hEiP^i!m|=8z^7GI4&HS|9O^WB<_#r1do+| zqps9KO_=Gx$NkI%;DSis=tN3TYvl*^1yv)8kELiKZSex)kxP%a{U8}rzUGdp>3<}XqSaJT>f literal 0 HcmV?d00001 diff --git a/srchook/images/g96mmenu.bmp b/srchook/images/g96mmenu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f34eb3251a80a455aef8b92ad5effd6690b8715 GIT binary patch literal 478 zcmZ?ry~oG^24z4}1Bg|CSO|z28CZZM149N>9?Ss}0x$+c0|N*#G&DdcAPHmwaRbAF z0|$T-|G|ji|9=n*h=C9!1SC2z00RYLfr1#ub%cM#6#I@v45+TX91K9}LClU0pgN#? zfq)$(2BCrK_<=6}{~s&{WP)f0s5%a)Iv_2`2x6mxBWFFz~@5);s}I K?>j8&7#IMbe#Hd< literal 0 HcmV?d00001 diff --git a/srchook/images/g96res.bmp b/srchook/images/g96res.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1bf079e25ee4f781e29c9b4016559ced1e7faba7 GIT binary patch literal 334 zcmZus!3_d24D(4yeO7`cn1ese!i)Bq9~rA-Fa{e0C%tedK^nW3o2KdIdRq|jAfJg7 zaU>QT$iOT39|^#O$lS=3gkX%p1B-;2D}u`{QfX`4fx6c^}hTFds9@OIANjeayg6v3H4h&XA2 literal 0 HcmV?d00001 diff --git a/srchook/images/max.bmp b/srchook/images/max.bmp index e31080ab77a1dbe0cad9aaebee816d705de55965..0ead5e08e073943d16cf153a928e513acb2b053e 100644 GIT binary patch literal 334 zcma)$%MAiC3`A!oq#Rd*Ca8lu)WV7EF*jUR%AkyNU|v28D=h~c&*aHbY+tUoNi81u z8J*A(O*-JxtNAZW5~-B>g@Y(5=gfn*lzSz_sUz3GK-KTE1V>-5A=Qn(TaF+l8 literal 334 zcmYk1u?@m76hzM`f^-mQC=nH63WR833n-C6$cd=j*(v9b)o{U8}rzUGdp>3<}XqSaJT>f literal 334 zcmYk1y$!-J6ok(x0(TH-C=nH63WR833n)=Q$cd=jIV-ROLwF2Epk#w^&rx1-_MJaH zKlx{WJQ*Z8=7wI-bJ`$d0-uz9%oIJq3Gds5Nu)hujNE9_MAHb-98zLT%1-Csw8M&A zw+iKehjn*}+H=eEo)0@=PlsZB6^0cC$b1#~ZkA-e#7e!E9#JSpYvt#5rR=_MuQc5Ja1m{Q(XQ3jL?x6FPd<>4^4!Y%KH!+CM#xs7}+1MWThfZE6 ze22DZgF3Bn>E`~+lEhLJKTFznq{ogM=!U1P@%tWXMnO_bC H1q=)Tn!|Ge diff --git a/srchook/images/mock.bmp b/srchook/images/mock.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9a8021644ff90c3df144d9ca58fc06772401e022 GIT binary patch literal 153718 zcmeI5Ux*~feaG9@`F5ne+@L2rvV@Fb3D5VI2YaJZA(mKRa5(r$|zE*s^jlXNxwm<&(TEX4KFWfXh4Gh6g z0mK$4!?UlwWRstm;@VRQ2TD1H!E z-3arg{v(*4@!!O+2eP^-It(>l!MmDxASH!FAQ4Ce5`jd(O@RGGfpH%P(FKOk7z1u| zlll)gGy4cQfgSmA6o}C?0dfLo3#GV|K%1YKV&dl{RzE;HQ~qo0PqyH9Ety~)Rp%a7 zTj0T%_m=+42wT7uLI`l?fz@ULWdDK2Px_A{ByW;YO9qMq{nmskW>V6&n}C`5s#OFd zllU1D^S09d!DksNYE^7r{&YMMNCXmrL}1McY@OZS!UOtQdMtmSA!ON8ml?9N0~M@! zw(M(%5-wj#00)@D)?ePZapTIBKfZC}$Cn0VU;8X$7~enMzyFIrIy}6b46wI3Y<&vz zd*eO;!T=M$-u!5OhyOx;hlh8P1NY?z^Lypl8#llY4d9K$uQ$KL!{5C1?BU`4_h^TS zUtfNkH(t4Q>(+0<_81bszWhdq|9tD#-_Z6L62HFuHgCMH%$z5r=|-~Hf&|CFVdtsD?j=tE#MJN(xVKKS6u z#kd%cvB}lTQ}e{H0}lBKLhu7cUr78q=;ZiWY1rR*Ed1mrraPo0De-HQ$$*aV;J(R! z+j!=s&|!1@xVf+cOT646*he>@a!|O#E8>EQg&BGVyEk>ywiB^`X_4 zP5jzS`lKX&eQ331*MlGW0nRBfFVjQfOs2LOCm49Eb+}4ahJ76T6}fNtSF8^|84hcH z010Y(hQ>*TWmx1Vvg)0Jp0FPLIG?ro0hp7Yk|k1t!+)|rSxl+%gXv)(iv-%#YzvcP z!VfD4T*dN*HL*X%OSOOE!^$l+zq*SW+2p^K;eZAEk1QuV;NtSYSS=E;6REkV$S$`3 z@GgN>rCi+@nbbW|A*+GY#TVJos)T(($>_wd-xE}=C3ExhcNh(@YtsG+6XDk|#2Qo0 zrpqWB*vj2?;a668!I8u-4(KW6*T)5;049D>_y*2@ad|O7%Fxrd+h3$`Qf^+He{=H0 z(N=w&6@6%;>8DI4&Yc_2TY-{HTk zgp?94qUPUl=*?m4q zjo?TB?W&FNQ|HFJTxHpcZFq{}JfxZ+;in9&OOnki(nSjIo&0E1^k2Mt>MQ<78pbrf}Rk;&!v_878*J#+15{flIlJ?fKXK>P{k~LNVHDaDPl~wPMxs&}pNq)EAe&+3G{(epg{`Yos_P!9DErHA1K%_A2Di_=eLH*mZBH4(4+W_TDb>cVgdOjxb0xIvt6&tr zBD+1BKkm<;dHWz_2H~xXIvA!Zpj2b^Nx?b%W+Jt}Xny*#V6&4QOm@5LeN;(hquIvw zZmFQuFjdw00!k(PvXO(IR<%QZlWfuaFhMK>%+Jw=lp=^6WLXTqAXWWJrA?}vU#Uu6 z-J=EDUtSr_QFd@Jsdnv{b<&;DY-a7+QbBPmuUl2WQhECiqiRY0hf$BZ=h-K5Nc&RF<(A42zN_;^7!6%8i5{y0puIaQtEkMaw z`wLOkuT#kWEsJ0A5-ba7FnBpQ zaPs@;BitncO0pH{Ure)P=Z=`q^BjodMQhK0hN#`&AY z4n}`b89Kcmv95}(wD zm&c8tgH+*UyeAk~s_}>;6E{DlYFXo#((O3HbX*?P#RM2&Wcz0{(Uu*m$WMomQprV~ zs|sgxR#2U6p#7PmVmqH7gd*EN>vS$v7C%bIlqyV>D$^i-xF|Aqq5nEdiYqJ*E|PKl zLR8hp&vB&+Qx(BaW!3L7SGuOixnng2ka1j!Fr!(ZDplM;_J>vo^}xT+{?H1cwD_m> zI4bQ#Ry)9cey*yVZR27}6{aeJ-)K6)ED2W}D}ZkQoleKa4jzWW@?9i9^n-I%<;B8E z6{aeJpR|A5xY|ee$8LT!nzLIloWHu~a=MzCId}Nb<6Kp`(ON{Q!c;}@ljr8nZu$A~ zDa9h+UIf1oRe08sgSJJKDoj-bKelSp{vF}oinITaJ0p~YlgG7xaxOWkTNN(WqDmE} zDu$o!YEFK(P$a(qRj9NbVoDXJN}X*`|7#c2ZGW~@;#bi?Yi&Qq>q@e>ZEv!Ef}?4i94Z1*ytwg}ND2sxVc<`PpC|K6I4ye62o{7=A&j^2L=Z zOx19Hb$>z!+ZF0U7%L7BL8=-~7gMS*RjNJ%{C7BrQATD>Zzr-(& zKwR!*e~Dilfw@V?)BM_H6 z*)raRlOWC;LnM;t0g$PWE@2 z_%)uqYdrY3db`EI-w%kpX71eT1GoHW?sOvWEBIy=Y?Ao(zd)ATIX`+8@8d>cj+o-(Xt5AAY%3(Eif>kKvaSIn({4 zD13=u9KOUa@!ReS>}if8r1me4a^jcxCI1bzfj;BsWj)zgpRb)>|8+mb6?bG^_|@wf zYTQ&i+vCrtQgo zK2H2fb8AH^`;%XJ=^&W+wV+uE7C(+&TKw4jDT2v=Eo^19;wKH3?t{_s>i(Ch;77Lo z!rHZes4%Th1#V5eA2%bN_$7X&m%1aB|KcYbX@OO+<5g;CZ0+nX6ilF8;ui?YA(r?# zzyu~Ieu1DIVu_yvOknb=@#9)jaOiXYt)-R^55|X8_Qh*rBp_*JB9KM&%^>sT_g zW9F*#+O8Bo<-Cd_%~bfg%@5Cxhd)1V)Ud)fwZWFBFdrX3_zcN7{TH}UGm03$HCv}a ztQ9{R06GWIsn(AwGGGUO>^3N(`VaIZjk$g$FR``bM+oPug_eB9*zo7`I1jih1i4NAzJFLYxCO z{vlT>E1jJZ!x0W)pb#AiM9aWD96PgTG%6^{4A8me-{7iAI$}S@6?SD%P={$L5J_3>mx=JMc%mL$$W~ z-70jUXs3*uC^|1iEPx5IQH@z zmmEi`iS8^&*R$I9ZUS2RC|-X6(w z_>J?)_a%Jq`R9M`st{&yWpEh{#&KpS7sM~b{DwY%P}yEt?7@*a{IdMD=k-(VZu`U9 zzyS*|#lM>$=d|();}>9l!}!6S$_F?GV=FT*gx}fXf1vQ!U-I$$=tV3J$Z6;ELk&lk zO_zmjMoxnNzV-wC3t6viyZv`YnOD9vox1I>7{8QniiQpJ#7z=W4-XMW6lAfAddpy*&0O*IdRoI5p(wgjKh{Kz^$K{q?h6`@`*b zxbS9nDRucHc zvH#uJI~DvcUU;qiP_lFU$Nu-zJIdGG?VlXa@7%rQvA;rE0`wi(&hGvx@ZZ_(3qLN` z51w~bXgr=xZyeI~-0dIjiedAGJ0AN}cknR6p6$BE*y=K=_de~PI{o6`>rm?Je|aE3 zHUBMU(*tM!d;XCM4`6`K@gF*vqjUEeW&z&I&wlj({D;kd0dep6C7+>1szM!gb#m!{ zFHfiU@9#PJl@}fch@n_uRSD!VfJ`6>2rLcG&;2{rl`a_xMlW1O_@9 z;M(v5C7D}Hr=Ix~=f5}ZOs8-Bo4fr3KaO8u!Zbi1KU}YKr^kOo_?iAU!2W2=G{EbY z`PxzV@6&JIK282x-Zpd3=cWIhZ-3;(ZUhGCTpT@CevP)@zK+51hK^?cTXh~@|5feZ zeSiB$|CPoR2Iwju_|bot*nhADx+84V-Bl)UdP7HppOw|akNvNV|8~9YU#U#G;Bv1P z0l(uLzclJzD@f>0L&qR~X8k#!{gYzlcQRLFkROSKV*KnHEZG$sGX9eaqy5169OHDg z#i#&}fa;GM@b0==sD!AbOHpXHym7~ayaA=lQAX5$ou8V|D<9r>RT(|&S(W*-_r2p6 zx%tLhaM|X@n>Ge3p3hW!yL5ilJxl{db5r!Bf!6#8SuOqAnRKE3{Or-Qn_tNNU;81z zeCIFR{B(=EZ2PNFVA3N-rEE^WD>|?_q1xmpS(J#MA566j#$qjNF;VN#C6m_LmWpsY zh+?XY!`|589#5s{La<`BjK? z3^vvg6gq8x`gjvqy`5R2|8|rwHfgZ^wN5Nv+DcWftJoUCYtN6}L`QHXnsoYjN46%; zQ~Ud&U6t?P(Kjja>r1RIpZL{z^xaGR`VyMGe;_|DLaD_(^WLqV*c7|o{H|WP zT3i9iqPQZlt5+UhEgnC9jE(Ru+rONvWH51le+ECHg;%+TETuw8nJf<DTFO{FAVS$x_KPnzu=|$saVAi2j=jr+aGTd+WZ936X#d9 zd}=|t>*AFBv=4X7IQowce#U=gTvOSfe36jxUx32ZgvnI_sA~MwzI+mihFJ^HRT}eB z?XT*8adq9Dp4cB69~z<~g!6+lKSrAfSFYKg`X&;7g_CyF1{IqhgwU`Nk;8vAKP9(B z|0N7n^G5yal!PCX`tw6~aRq(H<15mW6d=bAg`0-|%5VS`=IsP_ByuyxE(VMY$-KdU zZxDp{;t$tc8lGmkP#IA}IVEE&YR3n*e~LyBKaICPKk-t1KMlR2{)j%&o?bI~70nn%*FXZ5keamNGksOaBml zE?ooD8&{zmKWl6p|5c%4Ifx&Tc(H)2xfotKQ`Z&dS3&EHmHbRqp2#-wi^G26_?7OQ z>`z~LSNqrLwMf)W;3?q8KGof?hB`(UKg={Z%quulmKUcUvVeeyT34|7VSFx&259tKQG3^UJn0P$(*JVM{P-#c z&H|5X2b>GruWJ0l9#hY`81YQ`^)e<)eL-?7z%J!lS(8Uh` zwehw1(T8pO6Mnk-h`R!g(7qbeJ0-37@wlc~!t*E`Hh$)0NdCnP!H=se4vb==9{We( zUHmw0D~J#QQSHC5!h-Q8KUp+@;n3+^LGkOJi!&E>RQ#0xBAx3ut}w{{6fgBomUH+y z;i^Kp_?7-ke&{x2HMMl%8b6dlS&cFpS7n7C&99?9vlh9u{{kFl%F2sf8i&o_R4ZKZ zb81)J%Rqjr|4{u1Xb~XZRsSJt(&cGsJ6trNZ*p0nJkW>;KU{4XSu4mf>X7A!99ycA z_eJ*~Qb0vdy|)TeCD8IInrzmTJeTU)FB>%h@@J~HBgF2Lqks4jhiA^v;Z z{G=DL$f;EF1QtFO1%B{e?}WCp7Z6?QbqWpM%*aR^va1{h3a}TUJ|} z#0T4-^c&LHH0obJ#X$dUSz9~7vcLK%k9BV#zc7D6O%gxzYa`%+*%g?{OlkM$gcaC;ka1=LuX&Qn{2KHwxYj=0g!>=el zc?+O7H^)ozU)8^t*D^LTr~k+|e)X%18~a)I)Is;m3+KOb=E{|EhVNcOa5QXKp$W9V zThrHJfN$P?_xh6f#R6;OpTqC`%P;>qzR+-QZ|9(xIrE-_2ZBQw>efx_SH;=J)!~V17SaEJsn%~2RAENn#{f#CEN8fO`Ciy`~@VWV+rM7}qNGl3{)A#;;0`t2+T|Ph15l^-X z(1@bIQTBHp=0|>`y$oOaI>-JLU5AfL!Jhf~IKO)-KXP0L4sv#i&(Qgfi_bn=9zP(# z?I~FX#GBYygPYlvV~rlx9Mjvz(YpVR9zOhU@`C|Bb&1bjbOszJ5w&*W8ow}S2*2qY zFu(VvZ@jl;ew{UGCdTqRfAg!qC;ayIo_gVh%kMVz*Y-!!vQ27f^_>uYGWB@B_zdlz zt1GXR4q3mV!8DAfQrL(ogK?ORl5MDJ+TX>mJh}k;`rZAf?%ut-5Pt9a{TDOecjZFB z{(RR$O22e|@GR86LAAE)<#+z(_rCh!Z$ks-Z{X)_w^U_V?OVP&KXZFrY>dZKr;nrk z%QiRVd>Q7yd;Sxy{`xc8zl#^YqUtlx{PcGP`uODlH^O&SIz}(-KX!LF-&G3@d;4S8 zgt0V$A@)~hUQA?;{k?ke;>8CFpmY+RlPY7$JrX(Kj>gl>X@HpI?QD$1eKE;9`TRx? zzej)u< zU!&FP)*h7F&{QA46z6YV{E9Nax$Zm9{_-h*)@}DXmI&Q<0(K4#4!BZ5gcJPD2}Afv zW8SFsoYVLYH#9Z*q5lo#r_9FLe_#Qc9Rq&GCv$S4`OWZrrF6V|M@~6Yp&|SvZ==>m z-+*mHQ-fdr=%(gpoXUL)b%)$3r>B1-c}CZvC8znp__&IFRLti7Q05?h@*Efk#rStE zoa*wyR`p7u67DFrpI>qQ;fDh7LPyqSl6XclvD)Wc9ZRuJz?6jj@$ppt`V3YryrLow z3mr|&GeW*?9DHrp@ zFKNmc+BwWI@>rqzV;jd$x`sym>nB1ZTsk|P-Y%OFY~*jYe@1LIx5N3F{+C;K5c`9OdUZZYxt{#o z$ZAIn+y*3Drg6xA0F+~hRSyHlFE#;Bd;q`cNV-0}P1;Z0Khc!(+0^nGx7{KB+xPir z4_+Q>+TZH(8=D8Xc8*MJ5WhJ`!+x2Ap`m0!m(();2ouIo!6hxWq= z13lD#Ib4-N7h9Fs5YI2R1fluKj}KW(|0~1%f&Qz9`>JmXJ-bWpMDde`Me$>F7(ek| zG}^TNKK9>Da83Dj!x)fyg7|TO#8BQAKI*gncSghEw@}45dnM@>zg1tcx63z(pM0lR zS^wBbi=P_2;C)iYRxDx_4CBDi=Qqy8lIqT%_;qs$O>OeC-QxtrSIz!Z3w@H_L;d#z z7{e1OVko~ZhdfDkvaGTuesN?M!mn``a(Iarrf7H(dgkoIkE(4y=DsvKzG~}MiL#C$ z66%;wkt6pLPVU3cX2*D0^o3P>VT#J4Ej!YOA17{HahBzK!>@Xt9F^xS0zMOsZ5gmD zFMU8A#6xWj0hQIxSPHCiWC%ZDX!wzYc_P~0mX)^o83E*J@H0mseWJoJe)L}Dzolta z0EocCAQDZ)X!A-?S_L!l??mAXp8t}U@n5q5!K+w_oRyCLGrH}wO*N|fL6t%Fvv zM*Q@hBPYL#4MgzG>i9LaI$-<;TP36T>BrHlWP^9Lx4ryVZhNrxQx@pqS787+^(iEq zAe+Ck0pvrwmTj&!uV(3b@$2Y+jq$)o5v8NjclobF#ZMg&As#M8M1}ToE2B}c+S|VT zR4d5V(CR-}#meI96(-F(tom`?g!)u8Gpy2nUw+1S4ZqS6>7HE`)BMaqv$aH#q*6PM zSz@ah?ZppOXz{B)*3n)4#19|L9Cbd8vYHlgyrt@6f70k#Z^v8G)jV6`7k6F4_~}Kc zwCNz=``o!XHmYuVp0ONw-J+eJ;WCVT+ePx@gP(IleW7-)_%R7|eum4(%^X`KzsBQ? zomIC-Nu2_niM7S?PKn4wJi{iT_6(L`_{;wWYLVmue2LDunf0ZbyJfI_`Vj8g+vIxrA)f47?aC}gp z{k1;BWf=Lki{hsqy5zg59PO-%w`01VO|K zEt{X37n+Kit(dH;C@RjnmoJL&h)E(pq_u2M$ti^vJ;ALs_jy;(KsP?aWf=Lk;D?WF zGEC3(IbkWQ>SxuU`qUpQPJSlEY?Wnd4RwCXWO=B;PkXH5W!{NiIP!y-=C3SSp9uJk zTc6?baWlujPmLTmhVm23C`*rO%VYdfEs09QsG2KtL}lSoa8h;Gyp%K7_;p%dNl^Q{ z*svnl2U{uI`57+5$hQSQfJYe2j|j}Q$JR0wh0;zj)yCF1TAd%0>8mySqX`Fnn2T3Y zoWJA}8tMEDmyeq{R@&casQn2)es+Wvm&S};0s_iT95_HXn^*en3%Hu)99A84XR4Irxbdqe^Y<_eJt6 zKf`4h`L^-=q_yg1BkWA29U|J!z!09P{1Oq_kwZ*HM6?)H4RQ|6eUg>^H9o`T<7SRU z^XpT})s-c`)@Qg3Bi}ahlZy&|5}xq-!Ri{=oRTGea{$dbJVrAs!Tt=F&u`7K5!^n7 zE&_q$7c=^sR$p*aC9Pkq8V*mx#(x!}Q59X^SYLi!mYdQP0n^5%Z6c5eBm#**B9I6q z0*OE(kO(9Ki9jNd2qXfDKq8O`Bm#**B9I6q0*OE(kO(9Ki9jNd2qXfDKq8O`Bm#** JB5>RU{vR^M%`pG~ literal 0 HcmV?d00001 diff --git a/srchook/images/res.bmp b/srchook/images/res.bmp index 972c9b653667fef9ea792b5c24b6557c84c82f28..1bf079e25ee4f781e29c9b4016559ced1e7faba7 100644 GIT binary patch literal 334 zcmZus!3_d24D(4yeO7`cn1ese!i)Bq9~rA-Fa{e0C%tedK^nW3o2KdIdRq|jAfJg7 zaU>QT$iOT39|^#O$lS=3gkX%p1B-;2D}u`{QfX`4fx6c^}hTFds9@OIANjeayg6v3H4h&XA2 literal 334 zcmYk1u?@m76hzNbB-}xup^Oj(VhV(4VGAfxKq!f*+}SIz14DQWMxbN^bKfQo7vK5G z{`p_t?hgu44Rb}$=qasGFo9RhAto6Ozy)K{#w5}P-g{nzxDbL6%}B*sc`3C_`-o~09I%tp3cDaYU#Z0#0alE!5~s^kCjV}Cotee6`? z0pGwCTtKH2EWHc=BPWq^u3j(_IK>!gq>@T0E5OMm=tBcCRl#{x<8`(>y-(`(J*w*}TO(hkD*(lD>wuZQ=j` literal 334 zcmYLDu?@m75IjqfNJ*ffL=*@y1wxd-7En_``#~tN*nk}v!ecN3B^#LY$9lhg=hOZ9 z?d{>{pmim$h$%5494a#KQ7$w#DF8P_hJ#E=2to*KMBRunDS|6mq><0npMIu&)-`+C z7o^ O+O&U_e42mDbpifNjc&yN diff --git a/srchook/ntshook.c b/srchook/ntshook.c index b0f2580..c21b536 100644 --- a/srchook/ntshook.c +++ b/srchook/ntshook.c @@ -93,11 +93,10 @@ __declspec(dllexport) BOOL CALLBACK NtStyleInstallUserHook() { USERAPIHOOKINFO uah; - uah.m_size = sizeof(uah); - uah.m_dllname1 = NULL; - uah.m_funname1 = NULL; - uah.m_dllname2 = L"ntshk64.dll"; + uah.m_funname1 = L"NtStyleInitUserHook"; + uah.m_dllname1 = L"ntshk64.dll"; uah.m_funname2 = L"NtStyleInitUserHook"; + uah.m_dllname2 = L"ntshk64.dll"; return RegisterUserApiHook(&uah); }