Skip to content

Commit b3a5bae

Browse files
committed
build: 改进构建流程
1 parent 7e52ad3 commit b3a5bae

File tree

13 files changed

+555
-5
lines changed

13 files changed

+555
-5
lines changed

GrantUiAccess.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ VisualStudioVersion = 17.11.35201.85
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GrantUiAccess", "GrantUiAccess\GrantUiAccess.csproj", "{21335543-EFA9-4107-B625-EEECA2B902CB}"
77
EndProject
8+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uiaccess", "uiaccess\uiaccess.vcxproj", "{FA06F654-89DA-419D-B84D-BF27674D67DA}"
9+
EndProject
810
Global
911
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1012
Debug|Any CPU = Debug|Any CPU
@@ -27,6 +29,18 @@ Global
2729
{21335543-EFA9-4107-B625-EEECA2B902CB}.Release|x64.Build.0 = Release|Any CPU
2830
{21335543-EFA9-4107-B625-EEECA2B902CB}.Release|x86.ActiveCfg = Release|Any CPU
2931
{21335543-EFA9-4107-B625-EEECA2B902CB}.Release|x86.Build.0 = Release|Any CPU
32+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|Any CPU.ActiveCfg = Debug|x64
33+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|Any CPU.Build.0 = Debug|x64
34+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|x64.ActiveCfg = Debug|x64
35+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|x64.Build.0 = Debug|x64
36+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|x86.ActiveCfg = Debug|Win32
37+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Debug|x86.Build.0 = Debug|Win32
38+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|Any CPU.ActiveCfg = Release|x64
39+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|Any CPU.Build.0 = Release|x64
40+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|x64.ActiveCfg = Release|x64
41+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|x64.Build.0 = Release|x64
42+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|x86.ActiveCfg = Release|Win32
43+
{FA06F654-89DA-419D-B84D-BF27674D67DA}.Release|x86.Build.0 = Release|Win32
3044
EndGlobalSection
3145
GlobalSection(SolutionProperties) = preSolution
3246
HideSolutionNode = FALSE

GrantUiAccess/GrantUiAccess.csproj

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@
1313
<ExcludeAssets>runtime</ExcludeAssets>
1414
</PackageReference>
1515
</ItemGroup>
16+
17+
<ItemGroup>
18+
<ProjectReference Include="..\uiaccess\uiaccess.vcxproj">
19+
<ReferenceOutputAssembly>True</ReferenceOutputAssembly>
20+
<CopyLocalSatelliteAssemblies>True</CopyLocalSatelliteAssemblies>
21+
</ProjectReference>
22+
</ItemGroup>
1623

1724
<ItemGroup>
1825
<None Update="manifest.yml">
@@ -24,8 +31,5 @@
2431
<None Update="icon.png">
2532
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
2633
</None>
27-
<None Update="UIAccessDLL.x64.dll">
28-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
29-
</None>
3034
</ItemGroup>
3135
</Project>

GrantUiAccess/Plugin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ private void CurrentOnAppStarted(object? sender, EventArgs e)
3939
AppBase.Current.MainWindow.Topmost = true;
4040
}
4141

42-
[DllImport("UIAccessDLL.x64.dll", EntryPoint = "PrepareForUIAccess", CallingConvention = CallingConvention.Cdecl)]
42+
[DllImport("uiaccess.dll", EntryPoint = "PrepareForUIAccess", CallingConvention = CallingConvention.Cdecl)]
4343
private static extern int PrepareForUIAccess();
4444
}

GrantUiAccess/UIAccessDLL.x64.dll

-64.5 KB
Binary file not shown.

GrantUiAccess/manifest.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ id: grantUiAccess
66
name: UIAccess 提权
77
description: 本插件可以为 ClassIsland 提升 UIAccess 令牌,使 ClassIsland 可以置顶到全屏 UWP 应用和系统界面上。
88
entranceAssembly: "GrantUiAccess.dll"
9-
version: 1.0.0.0
9+
version: 1.0.0.1
1010
apiVersion: 1.5.0
1111
author: HelloWRC, Doubx690i
1212
url: https://github.com/HelloWRC/GrantUiAccess

uiaccess/.manifest

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
2+
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
3+
<security>
4+
<requestedPrivileges>
5+
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
6+
</requestedPrivileges>
7+
</security>
8+
</trustInfo>
9+
<dependency>
10+
<dependentAssembly>
11+
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" />
12+
</dependentAssembly>
13+
</dependency>
14+
<asmv3:application>
15+
<asmv3:windowsSettings>
16+
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
17+
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
18+
</asmv3:windowsSettings>
19+
</asmv3:application>
20+
</assembly>

uiaccess/resource.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
#define IDD_MAIN 100
3+
#define IDC_MAIN_UIACCESS 101
4+
#define IDC_MAIN_TOP 102
5+
#define IDC_MAIN_OPEN_TASKMGR 103
6+
#define IDC_MAIN_LBL_CMD 104
7+
#define IDC_MAIN_CMD 105
8+

uiaccess/resource.rc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "resource.h"
2+
3+
#define APSTUDIO_READONLY_SYMBOLS
4+
#include "winres.h"
5+
#undef APSTUDIO_READONLY_SYMBOLS
6+
7+
1 RT_MANIFEST MOVEABLE PURE ".manifest"
8+
9+
IDD_MAIN DIALOGEX 0, 0, 250, 150
10+
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU
11+
FONT 8, "MS Shell Dlg", 400, 0, 0x1
12+
CAPTION "UIAccess demo"
13+
BEGIN
14+
DEFPUSHBUTTON "&Close",IDOK,200,126,40,14
15+
CONTROL "&UIAccess",IDC_MAIN_UIACCESS,"Button",BS_3STATE|WS_DISABLED|WS_TABSTOP,10,10,120,16
16+
CHECKBOX "&Always on top",IDC_MAIN_TOP,10,30,120,16
17+
PUSHBUTTON "&Open Task Manager",IDC_MAIN_OPEN_TASKMGR,10,50,120,14
18+
LTEXT "Co&mmand Line:",IDC_MAIN_LBL_CMD,10,70,120,14,0
19+
EDITTEXT IDC_MAIN_CMD,10,84,230,14,ES_AUTOHSCROLL|ES_READONLY
20+
END
21+

uiaccess/test.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#include <windows.h>
2+
#include <tchar.h>
3+
#include "uiaccess.h"
4+
#include "resource.h"
5+
6+
static HINSTANCE g_hInstance;
7+
static HWND g_hdlg = NULL;
8+
static BOOL g_fHasUIAccess;
9+
static BOOL g_fAlwaysTop = TRUE;
10+
11+
static void SetTopmostStatus(BOOL fAlwaysTop)
12+
{
13+
DWORD dwFlags, dwExStyle;
14+
HWND hwndIns;
15+
16+
dwFlags = SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE;
17+
hwndIns = fAlwaysTop ? HWND_TOPMOST : HWND_NOTOPMOST;
18+
SetWindowPos(g_hdlg, hwndIns, 0, 0, 0, 0, dwFlags);
19+
20+
dwExStyle = (DWORD)GetWindowLongPtr(g_hdlg, GWL_EXSTYLE);
21+
g_fAlwaysTop = dwExStyle & WS_EX_TOPMOST;
22+
CheckDlgButton(g_hdlg, IDC_MAIN_TOP, g_fAlwaysTop);
23+
}
24+
25+
static INT_PTR CALLBACK DialogProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam){
26+
switch (uMsg){
27+
case WM_COMMAND:
28+
{
29+
UINT id = LOWORD(wParam), code = HIWORD(wParam);
30+
switch (id){
31+
case IDOK:
32+
case IDCANCEL:
33+
EndDialog(hdlg, id);
34+
break;
35+
36+
case IDC_MAIN_TOP:
37+
SetTopmostStatus(!g_fAlwaysTop);
38+
break;
39+
40+
case IDC_MAIN_OPEN_TASKMGR:
41+
ShellExecute(NULL, NULL, TEXT("taskmgr"), NULL, NULL, SW_SHOWDEFAULT);
42+
break;
43+
44+
}
45+
}
46+
return 0;
47+
48+
case WM_INITDIALOG:
49+
g_hdlg = hdlg;
50+
CheckDlgButton(hdlg, IDC_MAIN_UIACCESS, g_fHasUIAccess);
51+
SetTopmostStatus(g_fAlwaysTop);
52+
SetDlgItemText(hdlg, IDC_MAIN_CMD, GetCommandLine());
53+
return TRUE;
54+
55+
}
56+
return FALSE;
57+
}
58+
59+
static int InitInstance(HINSTANCE hInstance)
60+
{
61+
DWORD dwErr;
62+
INT_PTR iResult;
63+
64+
dbgstart();
65+
66+
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
67+
68+
dwErr = PrepareForUIAccess();
69+
if (ERROR_SUCCESS != dwErr)
70+
dbg("UIAccess error: 0x%08X\n", dwErr);
71+
g_fHasUIAccess = ERROR_SUCCESS == dwErr;
72+
73+
g_hInstance = hInstance;
74+
75+
iResult = DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DialogProc);
76+
g_hdlg = NULL;
77+
78+
CoUninitialize();
79+
80+
dbgend();
81+
82+
return (int)iResult;
83+
}
84+
85+
#ifdef MYTOOLCHAIN
86+
void main(){
87+
ExitProcess(InitInstance(GetModuleHandle(NULL)));
88+
}
89+
90+
#else
91+
int APIENTRY _tWinMain(
92+
_In_ HINSTANCE hInstance,
93+
_In_opt_ HINSTANCE hPrevInstance,
94+
_In_ LPTSTR lpCmdLine,
95+
_In_ int nCmdShow
96+
)
97+
{
98+
UNREFERENCED_PARAMETER(hPrevInstance);
99+
UNREFERENCED_PARAMETER(lpCmdLine);
100+
UNREFERENCED_PARAMETER(nCmdShow);
101+
return InitInstance(hInstance);
102+
}
103+
#endif
104+

uiaccess/uiaccess.c

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#include "uiaccess.h"
2+
#include <tlhelp32.h>
3+
#include <tchar.h>
4+
5+
static DWORD DuplicateWinloginToken(DWORD dwSessionId, DWORD dwDesiredAccess, PHANDLE phToken) {
6+
DWORD dwErr;
7+
PRIVILEGE_SET ps;
8+
9+
ps.PrivilegeCount = 1;
10+
ps.Control = PRIVILEGE_SET_ALL_NECESSARY;
11+
12+
if (LookupPrivilegeValue(NULL, SE_TCB_NAME, &ps.Privilege[0].Luid)) {
13+
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
14+
if (INVALID_HANDLE_VALUE != hSnapshot) {
15+
BOOL bCont, bFound = FALSE;
16+
PROCESSENTRY32 pe;
17+
18+
pe.dwSize = sizeof (pe);
19+
dwErr = ERROR_NOT_FOUND;
20+
21+
for (bCont = Process32First(hSnapshot, &pe); bCont; bCont = Process32Next(hSnapshot, &pe)) {
22+
HANDLE hProcess;
23+
24+
if (0 != _tcsicmp(pe.szExeFile, TEXT("winlogon.exe"))) {
25+
continue;
26+
}
27+
28+
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID);
29+
if (hProcess) {
30+
HANDLE hToken;
31+
DWORD dwRetLen, sid;
32+
33+
if (OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE, &hToken)) {
34+
BOOL fTcb;
35+
36+
if (PrivilegeCheck(hToken, &ps, &fTcb) && fTcb) {
37+
if (GetTokenInformation(hToken, TokenSessionId, &sid, sizeof (sid), &dwRetLen) && sid == dwSessionId) {
38+
bFound = TRUE;
39+
if (DuplicateTokenEx(hToken, dwDesiredAccess, NULL, SecurityImpersonation, TokenImpersonation, phToken)) {
40+
dwErr = ERROR_SUCCESS;
41+
} else {
42+
dwErr = GetLastError();
43+
}
44+
}
45+
}
46+
CloseHandle(hToken);
47+
}
48+
CloseHandle(hProcess);
49+
}
50+
51+
if (bFound) break;
52+
}
53+
54+
CloseHandle(hSnapshot);
55+
} else {
56+
dwErr = GetLastError();
57+
}
58+
} else {
59+
dwErr = GetLastError();
60+
}
61+
62+
63+
return dwErr;
64+
}
65+
66+
static DWORD CreateUIAccessToken(PHANDLE phToken) {
67+
DWORD dwErr;
68+
HANDLE hTokenSelf;
69+
70+
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hTokenSelf)) {
71+
DWORD dwSessionId, dwRetLen;
72+
73+
if (GetTokenInformation(hTokenSelf, TokenSessionId, &dwSessionId, sizeof (dwSessionId), &dwRetLen)) {
74+
HANDLE hTokenSystem;
75+
76+
dwErr = DuplicateWinloginToken(dwSessionId, TOKEN_IMPERSONATE, &hTokenSystem);
77+
if (ERROR_SUCCESS == dwErr) {
78+
if (SetThreadToken(NULL, hTokenSystem)) {
79+
if (DuplicateTokenEx(hTokenSelf, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_DEFAULT, NULL, SecurityAnonymous, TokenPrimary, phToken)) {
80+
BOOL bUIAccess = TRUE;
81+
82+
if (!SetTokenInformation(*phToken, TokenUIAccess, &bUIAccess, sizeof (bUIAccess))) {
83+
dwErr = GetLastError();
84+
CloseHandle(*phToken);
85+
}
86+
} else {
87+
dwErr = GetLastError();
88+
}
89+
RevertToSelf();
90+
} else {
91+
dwErr = GetLastError();
92+
}
93+
CloseHandle(hTokenSystem);
94+
}
95+
} else {
96+
dwErr = GetLastError();
97+
}
98+
99+
CloseHandle(hTokenSelf);
100+
} else {
101+
dwErr = GetLastError();
102+
}
103+
104+
return dwErr;
105+
}
106+
107+
static BOOL CheckForUIAccess(DWORD *pdwErr, DWORD *pfUIAccess) {
108+
BOOL result = FALSE;
109+
HANDLE hToken;
110+
111+
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
112+
DWORD dwRetLen;
113+
114+
if (GetTokenInformation(hToken, TokenUIAccess, pfUIAccess, sizeof (*pfUIAccess), &dwRetLen)) {
115+
result = TRUE;
116+
} else {
117+
*pdwErr = GetLastError();
118+
}
119+
CloseHandle(hToken);
120+
} else {
121+
*pdwErr = GetLastError();
122+
}
123+
124+
return result;
125+
}
126+
127+
DWORD PrepareForUIAccess() {
128+
DWORD dwErr;
129+
HANDLE hTokenUIAccess;
130+
BOOL fUIAccess;
131+
132+
if (CheckForUIAccess(&dwErr, &fUIAccess)) {
133+
if (fUIAccess) {
134+
dwErr = ERROR_SUCCESS;
135+
} else {
136+
dwErr = CreateUIAccessToken(&hTokenUIAccess);
137+
if (ERROR_SUCCESS == dwErr) {
138+
STARTUPINFO si;
139+
PROCESS_INFORMATION pi;
140+
141+
GetStartupInfo(&si);
142+
if (CreateProcessAsUser(hTokenUIAccess, NULL, GetCommandLine(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
143+
CloseHandle(pi.hProcess), CloseHandle(pi.hThread);
144+
ExitProcess(0);
145+
} else {
146+
dwErr = GetLastError();
147+
}
148+
149+
CloseHandle(hTokenUIAccess);
150+
}
151+
}
152+
}
153+
154+
return dwErr;
155+
}

0 commit comments

Comments
 (0)