windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/dbgext/exec.cxx
2020-09-26 16:20:57 +08:00

192 lines
3.9 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1995-1999 Microsoft Corporation
Module Name:
exec.cxx
Abstract:
This module contains an NTSD debugger extension for executing
external commands.
Author:
Keith Moore (keithmo) 12-Nov-1997
Revision History:
--*/
#include "inetdbgp.h"
/************************************************************
* Execute
************************************************************/
DECLARE_API( exec )
/*++
Routine Description:
This function is called as an NTSD extension to ...
Arguments:
hCurrentProcess - Supplies a handle to the current process (at the
time the extension was called).
hCurrentThread - Supplies a handle to the current thread (at the
time the extension was called).
CurrentPc - Supplies the current pc at the time the extension is
called.
lpExtensionApis - Supplies the address of the functions callable
by this extension.
lpArgumentString - Supplies the asciiz string that describes the
ansi string to be dumped.
Return Value:
None.
--*/
{
BOOL result;
STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
INIT_API();
//
// Skip leading blanks.
//
while( *lpArgumentString == ' ' ||
*lpArgumentString == '\t' ) {
lpArgumentString++;
}
//
// Use "cmd.exe" by default.
//
if( *lpArgumentString == '\0' ) {
lpArgumentString = "cmd";
}
//
// Set the prompt environment variable so the user will have clue.
//
SetEnvironmentVariable(
"PROMPT",
"!inetdbg.exec - $p$g"
);
//
// Launch it.
//
ZeroMemory(
&startInfo,
sizeof(startInfo)
);
ZeroMemory(
&processInfo,
sizeof(processInfo)
);
startInfo.cb = sizeof(startInfo);
result = CreateProcess(
NULL, // lpszImageName
lpArgumentString, // lpszCommandLine
NULL, // lpsaProcess
NULL, // lpsaThread
TRUE, // fInheritHandles
0, // fdwCreate
NULL, // lpvEnvironment
NULL, // lpszCurDir
&startInfo, // lpsiStartInfo
&processInfo // lppiProcessInfo
);
if( result ) {
//
// Wait for the child process to terminate, then cleanup.
//
WaitForSingleObject( processInfo.hProcess, INFINITE );
CloseHandle( processInfo.hProcess );
CloseHandle( processInfo.hThread );
} else {
//
// Could not launch the process.
//
dprintf(
"cannot launch \"%s\", error %lu\n",
lpArgumentString,
GetLastError()
);
}
} // DECLARE_API( exec )
/*
CallExtension allows one extension to call another extension in a
different DLL. From TomCan.
DECLARE_API(test)
{
NTSTATUS status = ERROR_SUCCESS;
status = DO_EXTENSION("kdextx86.dll", "pool", args);
dprintf("\n\nStatus: %08X\n", status);
}
*/
NTSTATUS
CallExtension(
PCSTR szModuleName,
PCSTR szFunction,
HANDLE hCurrentProcess,
HANDLE hCurrentThread,
ULONG dwCurrentPc,
ULONG dwProcessor,
PCSTR args)
{
PWINDBG_EXTENSION_FUNCTION pFn = NULL;
HINSTANCE hlib = NULL;
NTSTATUS status = ERROR_SUCCESS;
hlib = LoadLibrary(szModuleName);
if (hlib != NULL)
{
pFn = (PWINDBG_EXTENSION_FUNCTION)GetProcAddress(hlib, szFunction);
if (pFn != NULL)
{
(pFn)(hCurrentProcess, hCurrentThread, dwCurrentPc,
dwProcessor, args);
}
FreeLibrary(hlib);
}
status = GetLastError();
return status;
}