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.
135 lines
4.6 KiB
135 lines
4.6 KiB
// --------------------------------------------------------------------------
|
|
// Module Name: BadApplicationServerExports.cpp
|
|
//
|
|
// Copyright (c) 2000, Microsoft Corporation
|
|
//
|
|
// This file contains functions exported by name from the BAM service dll.
|
|
//
|
|
// History: 2000-12-04 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
#ifdef _X86_
|
|
|
|
#include "StandardHeader.h"
|
|
|
|
#include "BadApplicationAPIServer.h"
|
|
#include "GracefulTerminateApplication.h"
|
|
|
|
extern HINSTANCE g_hInstance;
|
|
|
|
// --------------------------------------------------------------------------
|
|
// ::FUSCompatibilityEntryTerminate
|
|
//
|
|
// Arguments: pszCommand = Command line from rundll32.
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Internal entry point to execute termination of a specified
|
|
// process on behalf of the BAM server. The server starts the
|
|
// rundll32 process on the correct session so that it can find
|
|
// the window belonging to that session.
|
|
//
|
|
// History: 2000-10-27 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
EXTERN_C void WINAPI FUSCompatibilityEntryTerminate (const WCHAR *pszCommand)
|
|
|
|
{
|
|
CGracefulTerminateApplication terminateApplication;
|
|
|
|
terminateApplication.Terminate(CBadApplicationAPIServer::StrToInt(pszCommand));
|
|
DISPLAYMSG("Where was the call to kernel32!ExitProcess in CGracefulTerminateApplication::Terminate");
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// ::FUSCompatibilityEntryPrompt
|
|
//
|
|
// Arguments: pszCommand = Command line from rundll32.
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Internal entry point to execute a prompt for termination of
|
|
// the parent process of this one. This is used by the BAM shim
|
|
// for type 1. Instead of bringing up UI in the application it
|
|
// creates a rundll32 process to call this entry point which
|
|
// brings up UI and returns a result to the parent in the exit
|
|
// code.
|
|
//
|
|
// History: 2000-11-03 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
EXTERN_C void WINAPI FUSCompatibilityEntryPrompt (const WCHAR *pszCommand)
|
|
|
|
{
|
|
CGracefulTerminateApplication::Prompt(g_hInstance, reinterpret_cast<HANDLE>(CBadApplicationAPIServer::StrToInt(pszCommand)));
|
|
DISPLAYMSG("Where was the call to kernel32!ExitProcess in CGracefulTerminateApplication::Prompt");
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// ::FUSCompatibilityEntryW
|
|
//
|
|
// Arguments: hwndStub = ?
|
|
// hInstance = ?
|
|
// pszCmdLine = ?
|
|
// nCmdShow = ?
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: External named entry point for rundll32.exe in case of
|
|
// external process hosting.
|
|
//
|
|
// History: 2000-10-10 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
EXTERN_C void WINAPI FUSCompatibilityEntryW (HWND hwndStub, HINSTANCE hInstance, LPWSTR pszCmdLine, int nCmdShow)
|
|
|
|
{
|
|
UNREFERENCED_PARAMETER(hwndStub);
|
|
UNREFERENCED_PARAMETER(hInstance);
|
|
UNREFERENCED_PARAMETER(nCmdShow);
|
|
|
|
typedef void (WINAPI * PFNCOMMANDPROC) (const WCHAR *pszCommand);
|
|
|
|
typedef struct
|
|
{
|
|
const WCHAR* szCommand;
|
|
PFNCOMMANDPROC pfnCommandProc;
|
|
} COMMAND_ENTRY, *PCOMMAND_ENTRY;
|
|
|
|
static const COMMAND_ENTRY s_commands[] =
|
|
{
|
|
{ L"terminate", FUSCompatibilityEntryTerminate },
|
|
{ L"prompt", FUSCompatibilityEntryPrompt }
|
|
};
|
|
|
|
int i, iLength;
|
|
WCHAR szCommand[32];
|
|
|
|
i = 0;
|
|
iLength = lstrlenW(pszCmdLine);
|
|
while ((i < iLength) && (pszCmdLine[i] != L' '))
|
|
{
|
|
++i;
|
|
}
|
|
iLength = i;
|
|
ASSERTMSG((i + sizeof('\0')) < ARRAYSIZE(szCommand), "Impending string overflow in ::BadApplicationEntryW");
|
|
lstrcpy(szCommand, pszCmdLine);
|
|
szCommand[iLength] = L'\0';
|
|
for (i = 0; i < ARRAYSIZE(s_commands); ++i)
|
|
{
|
|
if (lstrcmpiW(s_commands[i].szCommand, szCommand) == 0)
|
|
{
|
|
const WCHAR *pszParameter;
|
|
|
|
pszParameter = pszCmdLine + iLength;
|
|
if (pszCmdLine[iLength] == L' ')
|
|
{
|
|
++pszParameter;
|
|
}
|
|
s_commands[i].pfnCommandProc(pszParameter);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif /* _X86_ */
|
|
|