183 lines
4.5 KiB
C
183 lines
4.5 KiB
C
/*++
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
handle.c
|
||
|
||
Abstract:
|
||
|
||
Example of a test code for detached, background, no-window command
|
||
exectution.
|
||
|
||
Author:
|
||
|
||
Vladimir Z. Vulovic (vladimv) 06 - November - 1992
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
06-Nov-1992 vladimv
|
||
Created
|
||
|
||
--*/
|
||
|
||
#include "atclient.h"
|
||
#include <stdlib.h> // exit()
|
||
#include <stdio.h> // printf
|
||
#include <wincon.h> // FreeConsole()
|
||
|
||
|
||
|
||
WCHAR *
|
||
AsciizToUnicode(
|
||
IN CHAR * Asciiz
|
||
)
|
||
/*++
|
||
No attempt is made to clean up if we fail half way along. Cleanup
|
||
will be done at the exit process time.
|
||
--*/
|
||
{
|
||
UNICODE_STRING UnicodeString;
|
||
BOOL success;
|
||
|
||
RtlInitUnicodeString(
|
||
&UnicodeString,
|
||
NULL
|
||
);
|
||
|
||
//
|
||
// This call will attempt to allocate memory for UNICODE string.
|
||
//
|
||
|
||
success = RtlCreateUnicodeStringFromAsciiz(
|
||
&UnicodeString,
|
||
Asciiz
|
||
);
|
||
|
||
if ( success != TRUE) {
|
||
printf( "Failed to make unicode string out of %s\n", Asciiz);
|
||
return( NULL);
|
||
}
|
||
|
||
return( UnicodeString.Buffer);
|
||
}
|
||
|
||
|
||
WCHAR **
|
||
ArgvToUnicode(
|
||
IN int argc,
|
||
IN CHAR ** charArgv
|
||
)
|
||
/*++
|
||
No attempt is made to clean up if we fail half way along. Cleanup
|
||
will be done at the exit process time.
|
||
--*/
|
||
{
|
||
WCHAR ** argv;
|
||
int index;
|
||
|
||
argv = (WCHAR **)LocalAlloc(
|
||
LMEM_FIXED,
|
||
argc * sizeof( WCHAR *)
|
||
);
|
||
if ( argv == NULL) {
|
||
return( NULL);
|
||
}
|
||
|
||
for ( index = 0; index < argc; index++ ) {
|
||
|
||
if ( ( argv[ index] = AsciizToUnicode( charArgv[ index])) == NULL) {
|
||
return( NULL);
|
||
}
|
||
}
|
||
|
||
return( argv);
|
||
}
|
||
|
||
|
||
VOID __cdecl
|
||
main(
|
||
int argc,
|
||
CHAR ** charArgv
|
||
)
|
||
{
|
||
#define THIRTY_SECONDS (30 * 1000)
|
||
|
||
PROCESS_INFORMATION ProcessInformation;
|
||
STARTUPINFO StartupInfo;
|
||
HANDLE FileHandle;
|
||
WCHAR ** argv;
|
||
|
||
if ( argc < 2 || argc > 3) {
|
||
printf(" Usage: handle command_to_execute [log_file_to_open]\n");
|
||
exit( -1);
|
||
}
|
||
if ( ( argv = ArgvToUnicode( argc, charArgv)) == NULL) {
|
||
printf( "Failed to map input strings to unicode.\n");
|
||
exit( -1);
|
||
}
|
||
|
||
if ( !FreeConsole()) {
|
||
KdPrint(( " FreeConsole() fails with WinError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
FileHandle = CreateFile(
|
||
argc > 2 ? argv[ 2] : L"out.txt", // lpszName
|
||
GENERIC_READ | GENERIC_WRITE, // fdwAccess
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE, // fdwShareMode
|
||
NULL, // lpsa
|
||
OPEN_ALWAYS, // fdwCreate
|
||
FILE_ATTRIBUTE_NORMAL, // fdwAttrAndFlags
|
||
NULL // hTemplateFile
|
||
);
|
||
|
||
if ( FileHandle == INVALID_HANDLE_VALUE) {
|
||
KdPrint(( " CreateFile() fails with WinError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
if ( !SetStdHandle( STD_INPUT_HANDLE, FileHandle)) {
|
||
KdPrint(( " SetStdHandle( STDIN) fails with WinError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
if ( !SetStdHandle( STD_OUTPUT_HANDLE, FileHandle)) {
|
||
KdPrint(( " SetStdHandle( STDOUT) fails with WinError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
if ( !SetStdHandle( STD_ERROR_HANDLE, FileHandle)) {
|
||
KdPrint(( " SetStdHandle( STDERR) fails with WinError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
GetStartupInfo( &StartupInfo);
|
||
StartupInfo.lpTitle = NULL;
|
||
|
||
if ( !CreateProcess(
|
||
NULL, // image name is imbedded in the command line
|
||
argv[ 1], // command line
|
||
NULL, // pSecAttrProcess
|
||
NULL, // pSecAttrThread
|
||
TRUE, // this process will not inherit our handles
|
||
DETACHED_PROCESS | CREATE_NO_WINDOW, // we have no access to the console either
|
||
NULL, // pEnvironment
|
||
NULL, // pCurrentDirectory
|
||
&StartupInfo,
|
||
&ProcessInformation
|
||
)) {
|
||
KdPrint(( " CreateProcess() fails with winError = %d\n", GetLastError()));
|
||
exit( -1);
|
||
}
|
||
|
||
WaitForSingleObject( ProcessInformation.hProcess, THIRTY_SECONDS);
|
||
|
||
exit( 0);
|
||
}
|