//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1995 - 1999 // // File: certwrap.cpp // // Contents: Wrap a command line and expand envronment variables. // //-------------------------------------------------------------------------- #include #include #include "resource.h" #define WM_WRAPCOMMAND WM_USER+0 WCHAR wszAppName[] = L"CertWrap"; HINSTANCE hInstApp; #define ARRAYLEN(a) (sizeof(a)/sizeof((a)[0])) VOID WrapCommand( HWND hWnd, WCHAR const *pwszCommand) { WCHAR awc[4096]; WCHAR awcVar[128]; WCHAR const *pwszSrc; WCHAR *pwszDst; WCHAR *pwszVar; BOOL fTooLong = FALSE; BOOL fVarTooLong = FALSE; BOOL fVarNotFound = FALSE; DWORD cwc; STARTUPINFO si; PROCESS_INFORMATION pi; BOOL b; pwszSrc = pwszCommand; pwszDst = awc; while (L'\0' != (*pwszDst = *pwszSrc++)) { if ('%' == *pwszDst) { *pwszDst = L'\0'; pwszVar = awcVar; while (L'\0' != *pwszSrc) { if (L'%' == *pwszSrc) { pwszSrc++; break; } *pwszVar++ = *pwszSrc++; if (pwszVar >= &awcVar[ARRAYLEN(awcVar) - 1]) { fVarTooLong = TRUE; goto error; } } *pwszVar = L'\0'; cwc = GetEnvironmentVariable( awcVar, pwszDst, (DWORD) (ULONG_PTR) (&awcVar[ARRAYLEN(awcVar)] - pwszDst)); if (0 == cwc) { fVarNotFound = TRUE; goto error; } if ((DWORD) (ULONG_PTR) (&awcVar[ARRAYLEN(awcVar)] - pwszDst) <= cwc) { fTooLong = TRUE; goto error; } pwszDst += cwc; } else { pwszDst++; } if (pwszDst >= &awc[ARRAYLEN(awc)]) { fTooLong = TRUE; goto error; } } error: if (fVarNotFound) { MessageBox( hWnd, L"Environment Variable Not Found", awcVar, MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } if (fVarTooLong) { MessageBox( hWnd, L"Environment Variable Name Too Long", L"CertWrapper", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } if (fTooLong) { MessageBox( hWnd, L"Command Line Too Long", L"CertWrapper", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } MessageBox(hWnd, awc, L"CertWrapper", MB_OK); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; b = CreateProcess( NULL, awc, NULL, NULL, FALSE, 0, NULL, NULL, // lpCurrentDirectory &si, &pi); if (!b) { DWORD err; WCHAR awcErr[MAX_PATH]; err = GetLastError(); wsprintf(awcErr, L"CreateProcess failed: %d(%x)", err, err); MessageBox( hWnd, awcErr, L"CertWrapper", MB_OK | MB_ICONERROR | MB_SETFOREGROUND); } } //************************************************************************** // FUNCTION: MainWndProc(...) // ARGUMENTS: //************************************************************************** LRESULT APIENTRY MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: return(0); case WM_SIZE: return(0); case WM_DESTROY: PostQuitMessage(0); break; case WM_WRAPCOMMAND: WrapCommand(hWnd, (WCHAR const *) lParam); PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return(0); } //+------------------------------------------------------------------------ // // Function: WinMain() // // Synopsis: Entry Point // // Arguments: [hInstance] -- Instance handle // [hPrevInstance] -- Obsolete // [lpCmdLine] -- App command line // [nCmdShow] -- Starting show state //------------------------------------------------------------------------- extern "C" int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR pwszCmdLine, int nCmdShow) { MSG msg; WNDCLASS wcApp; HWND hWndMain; // Save the current instance hInstApp = hInstance; // Set up the application's window class wcApp.style = 0; wcApp.lpfnWndProc = MainWndProc; wcApp.cbClsExtra = 0; wcApp.cbWndExtra = 0; wcApp.hInstance = hInstance; wcApp.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcApp.hCursor = LoadCursor(NULL, IDC_ARROW); wcApp.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wcApp.lpszMenuName = NULL; wcApp.lpszClassName = wszAppName; if (!RegisterClass(&wcApp)) { return(FALSE); } // Create Main Window hWndMain = CreateWindow(wszAppName, L"CertWrapper Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (NULL == hWndMain) { return(FALSE); } // Make window visible // ShowWindow(hWndMain,nCmdShow); // Update window client area UpdateWindow(hWndMain); // Send off the message to get things started PostMessage(hWndMain, WM_WRAPCOMMAND, 0, (LPARAM) pwszCmdLine); // Message Loop while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)(msg.wParam); }