/*++ Copyright (c) 1994 Microsoft Corporation Module Name: smbrdr.c Abstract: This module implements a simple app to switch between rdr1 and rdr2 Author: Joe Linn (JoeLinn) 21-jul-94 Revision History: added in stuff to control the filesystem proxy mini AKA the reflector --*/ #include #include #include #include #include #include #include #include "smbrdr.h" #include //this might should be in smbrdr.h #include //this might should be in smbrdr.h VOID SwRxUsage(void); VOID SwRxPrintCurrentRdrMsg(void); BOOLEAN SwRxIsRdr2Running( void); BOOLEAN SwRxNoStop = FALSE; BOOLEAN SwRxNoStart = FALSE; BOOLEAN SwRxProxyEnabled = FALSE; VOID SwRxStartStop( IN PSWRX_REGISTRY_MUCKER Mucker ) { BOOLEAN Rdr2WasRunning = FALSE; BOOLEAN Rdr2IsRunning = FALSE; Rdr2WasRunning = SwRxIsRdr2Running(); if (!SwRxNoStop) { printf("Stopping rdr.......\n"); system("net stop rdr /y"); if (Rdr2WasRunning) { SwRxStopProxyFileSystem(); printf("Stopping rdbss.......\n"); system("net stop rdbss /y"); } } Mucker(); if (!SwRxNoStart) { printf("Starting rdr\n"); system("net start rdr"); printf("Starting messenger\n"); system("net start messenger"); printf("Starting netlogon\n"); system("net start netlogon"); if (SwRxProxyEnabled) { SwRxStartProxyFileSystem(); } } Rdr2IsRunning = SwRxIsRdr2Running(); DbgPrint("SMBRDR: %s was running, %s is running now\n", Rdr2WasRunning?"Rdr2":"Rdr1", Rdr2IsRunning?"Rdr2":"Rdr1" ); } VOID __cdecl main( int argc, char *argv[] ) { //NTSTATUS status; char *thisarg; ULONG i; if (argc<2) { SwRxPrintCurrentRdrMsg(); exit(0); } for (i=1;i<(ULONG)argc;i++) { thisarg=argv[i]; printf("thisarg=%s,argc=%d\n",thisarg,argc); if (!strncmp(thisarg,"/?",2) || !strncmp(thisarg,"-?",2)){ SwRxUsage(); } if (!strncmp(thisarg,"/1",2) || !strncmp(thisarg,"-1",2)){ printf("-1 no longer supported\n"); //SwRxStartStop(SwRxRdr1Muck); exit(0); } if (!strncmp(thisarg,"/2",2) || !strncmp(thisarg,"-2",2)){ SwRxStartStop(SwRxRdr2Muck); exit(0); } if (!strncmp(thisarg,"-!",2)){ SwRxNoStop = TRUE; SwRxNoStart = TRUE; continue; } if (!strncmp(thisarg,"-proxy",6)){ SwRxProxyEnabled = TRUE; continue; } if (!strncmp(thisarg,"-startproxy",11)){ SwRxStartProxyFileSystem(); exit(0); } break; } SwRxUsage(); } VOID SwRxUsage(void){ printf(" Usage: smbrdr [-!] [-1|-2] "); SwRxPrintCurrentRdrMsg(); exit(0); } VOID SwRxPrintCurrentRdrMsg(void){ PSZ notstring = "not "; if (SwRxIsRdr2Running()) { notstring = ""; } printf(" (Currently, rdr2 is %srunning.)\n",notstring); } BOOLEAN SwRxIsRdr2Running( void) /*++ Routine Description: This routine looks to see if the rdr is rdr2 by opening a handle and pushing down a FSCTL that rdr1 handles and rdr2 does not. Arguments: HANDLE pRdrHandle - a handle to be returned Return Value: NTSTATUS - STATUS_SUCCESS or reason for failure. --*/ { NTSTATUS ntstatus; HANDLE h; UNICODE_STRING DeviceName; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; // // Open the RDBSS device. // RtlInitUnicodeString(&DeviceName,DD_NFS_DEVICE_NAME_U); InitializeObjectAttributes( &ObjectAttributes, &DeviceName, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntstatus = NtOpenFile( &h, SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT ); //return(ntstatus); if (!NT_SUCCESS(ntstatus)) { printf("open didn't work\n"); return(FALSE); } // // Send the request to the RDBSS FSD. // ntstatus = NtFsControlFile( h, NULL, NULL, NULL, &IoStatusBlock, FSCTL_LMR_GET_VERSIONS, NULL, 0, NULL, 0 ); NtClose(h); return(ntstatus==STATUS_INVALID_DEVICE_REQUEST); } VOID SwRxStartProxyFileSystem(void){ NTSTATUS ntstatus; HANDLE h; UNICODE_STRING DeviceName; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; //UNICODE_STRING LinkTarget,VNetRootPart; //WCHAR StringBuffer[512]; // // Get the driver loaded. // if (SwRxProxyEnabled) { printf("Starting proxy driver.......\n"); system("net start reflctor"); } // // Open the Proxy FileSystem driver device. // RtlInitUnicodeString(&DeviceName,UMRX_DEVICE_NAME_U); InitializeObjectAttributes( &ObjectAttributes, &DeviceName, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntstatus = NtOpenFile( &h, SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT ); // // if we couldn't open.....just punt // if (!NT_SUCCESS(ntstatus)) { printf("Couldn't open the ProxyFilesystem device\n"); return; } // // Send the start request...this will also set up the server, netroot // and vnetroot // ntstatus = NtFsControlFile( h, NULL, NULL, NULL, &IoStatusBlock, FSCTL_UMRX_START, NULL, 0, NULL, 0 ); NtClose(h); // // now we have to do the bit about making the dosdevice if (! DefineDosDeviceW( DDD_RAW_TARGET_PATH | DDD_NO_BROADCAST_SYSTEM, L"X:", UMRX_DEVICE_NAME_U L"\\;X:" UMRX_CLAIMED_SERVERNAME_U UMRX_CLAIMED_SHARENAME_U )) { printf("Couldn't set X: as a dosdevice\n"); } } VOID SwRxStopProxyFileSystem(void){ NTSTATUS ntstatus; HANDLE h; UNICODE_STRING DeviceName; IO_STATUS_BLOCK IoStatusBlock; OBJECT_ATTRIBUTES ObjectAttributes; //UNICODE_STRING LinkTarget,VNetRootPart; //WCHAR StringBuffer[512]; // // Open the Proxy FileSystem driver device. // RtlInitUnicodeString(&DeviceName,UMRX_DEVICE_NAME_U); InitializeObjectAttributes( &ObjectAttributes, &DeviceName, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntstatus = NtOpenFile( &h, SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT ); // // if we couldn't open.....just punt // if (!NT_SUCCESS(ntstatus)) { printf("Couldn't open the ProxyFilesystem device\n"); return; } // // Send the stop request...this will also set up the server, netroot // and vnetroot // ntstatus = NtFsControlFile( h, NULL, NULL, NULL, &IoStatusBlock, FSCTL_UMRX_STOP, NULL, 0, NULL, 0 ); NtClose(h); // // now we have to get rid of the dosdevice if (! DefineDosDeviceW( DDD_REMOVE_DEFINITION | DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE | DDD_NO_BROADCAST_SYSTEM, L"X:", UMRX_DEVICE_NAME_U L"\\;X:" UMRX_CLAIMED_SERVERNAME_U UMRX_CLAIMED_SHARENAME_U )) { printf("Couldn't set X: as a dosdevice\n"); } if (SwRxProxyEnabled) { printf("Stopping proxy driver.......\n"); system("net stop reflctor /y"); } }