401 lines
8.7 KiB
C
401 lines
8.7 KiB
C
/*++
|
||
|
||
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 <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <windows.h>
|
||
#include "smbrdr.h"
|
||
|
||
#include <ntddnfs2.h> //this might should be in smbrdr.h
|
||
#include <ntddumod.h> //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");
|
||
}
|
||
}
|
||
|