diff options
Diffstat (limited to 'private/net/svcdlls/at/client/handle.c')
-rw-r--r-- | private/net/svcdlls/at/client/handle.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/private/net/svcdlls/at/client/handle.c b/private/net/svcdlls/at/client/handle.c new file mode 100644 index 000000000..d381134ea --- /dev/null +++ b/private/net/svcdlls/at/client/handle.c @@ -0,0 +1,182 @@ +/*++ + +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 _CRTAPI1 +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); +} |