You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
5.4 KiB
262 lines
5.4 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
|
//
|
|
// File: certwrap.cpp
|
|
//
|
|
// Contents: Wrap a command line and expand envronment variables.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <windows.h>
|
|
#include <stdlib.h>
|
|
|
|
#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);
|
|
}
|