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