andre@1010: #include andre@1010: #include "exdll.h" andre@1010: #include "util.h" andre@1010: #include "logging.h" andre@1010: andre@1010: static HINSTANCE g_hInstance; /* Our Instance. */ andre@1010: static HWND g_hwndParent; /* Handle of parent window or NULL. */ andre@1010: andre@1010: #define UNUSED(x) (void)(x) andre@1010: andre@1010: /* Standard entry point for DLLs. */ andre@1010: int WINAPI andre@1010: DllMain (HANDLE hinst, DWORD reason, LPVOID reserved) andre@1010: { andre@1010: UNUSED(reserved); andre@1010: if (reason == DLL_PROCESS_ATTACH) andre@1010: g_hInstance = hinst; andre@1010: return TRUE; andre@1010: } andre@1010: andre@1010: void __declspec(dllexport) __cdecl Exec(HWND hwndParent, andre@1010: int string_size, andre@1010: char *variables, andre@1010: stack_t **stacktop) andre@1010: { andre@1010: HANDLE restricted_token = NULL; andre@1010: STARTUPINFO si; andre@1010: PROCESS_INFORMATION pi; andre@1010: andre@1010: EXDLL_INIT(); andre@1010: andre@1010: UNUSED(hwndParent); andre@1010: UNUSED(g_hwndParent); andre@1010: andre@1010: memset(&si, 0, sizeof(STARTUPINFO)); andre@1010: andre@1010: if (!stacktop || !*stacktop || !(*stacktop)->text) andre@1010: { andre@1010: ERRORPRINTF ("Invalid call to exec\n"); andre@1010: return; andre@1010: } andre@1010: andre@1010: restricted_token = get_normal_token(); andre@1010: andre@1010: if (restricted_token == NULL || restricted_token == INVALID_HANDLE_VALUE) andre@1010: { andre@1010: ERRORPRINTF ("Failed to obtain restricted token.\n"); andre@1010: return; andre@1010: } andre@1010: andre@1010: if (CreateProcessAsUser(restricted_token, andre@1010: 0, andre@1010: (*stacktop)->text, andre@1010: 0, andre@1010: 0, andre@1010: FALSE, andre@1010: CREATE_NEW_CONSOLE, andre@1010: 0, andre@1010: 0, andre@1010: &si, andre@1010: &pi)) andre@1010: { andre@1010: CloseHandle(pi.hProcess); andre@1010: CloseHandle(pi.hThread); andre@1010: } andre@1010: } andre@1010: