windows-nt/Source/XPSP1/NT/ds/security/services/ca/certwrap/certwrap.cpp
2020-09-26 16:20:57 +08:00

263 lines
5.1 KiB
C++

//+-------------------------------------------------------------------------
//
// 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);
}