192 lines
3.9 KiB
C++
192 lines
3.9 KiB
C++
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|