windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/at/client/handle.c

183 lines
4.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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);
}