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");
|
|||
|
}
|
|||
|
}
|
|||
|
|