📄 srfunc.c
字号:
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
smbrdr.c
Abstract:
This module implements the functios to load and unload the
smb monolithic minirdr. Also explicit start/stop control is
provided
This module also populates the registry entries for the
driver, and the network provider.
--*/
//#ifndef UNICODE
//#define UNICODE
//#endif
#include <windows.h>
#include <devioctl.h>
#include <stdlib.h>
#include "srfunc.h"
#ifdef DBG
#define DbgP(_x_) DbgPrint _x_
#else
#define DbgP(_x_)
#endif
ULONG _cdecl DbgPrint( LPTSTR Format, ... );
#define TRACE_TAG L"SMBRDR: "
TCHAR* SmbMrxDriverName = TEXT("SmbMRx");
// load action states
ULONG_PTR LoadActionStates[] =
{
RDR_NULL_STATE,
RDR_LOADING,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE
};
// unload action states
ULONG_PTR UnloadActionStates[] =
{
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_UNLOADING,
RDR_UNLOADING,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE
};
// Start action states
ULONG_PTR StartActionStates[] =
{
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_STARTING,
RDR_STARTING,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE
};
// Stop action states
ULONG_PTR StopActionStates[] =
{
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_STOPPING
};
ULONG_PTR TransitionActionStates[] =
{
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_UNLOADED,
RDR_LOADED,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_STOPPED,
RDR_STARTED,
RDR_NULL_STATE
};
ULONG_PTR ErrorActionStates[] =
{
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_LOADED,
RDR_UNLOADED,
RDR_NULL_STATE,
RDR_NULL_STATE,
RDR_STARTED,
RDR_STOPPED,
RDR_NULL_STATE
};
ULONG_PTR NoneActionStates[] =
{
RDR_NULL_STATE,
RDR_UNLOADED,
RDR_UNLOADING,
RDR_LOADING,
RDR_LOADED,
RDR_STOPPED,
RDR_STOPPING,
RDR_STARTING,
RDR_STARTED
};
ULONG_PTR *ActionsStatesArray[] =
{
LoadActionStates,
UnloadActionStates,
StartActionStates,
StopActionStates,
TransitionActionStates,
ErrorActionStates,
NoneActionStates
};
ACTIONVECTOR ActionProcs[] =
{
RdrLoad,
RdrUnload,
RdrStart,
RdrStop,
RdrDoNothing,
RdrDoNothing,
RdrDoNothing
};
typedef enum _INSTALLCHECKS
{
installcheck_start,
installcheck_driverfile,
installcheck_providerfile,
installcheck_serviceentry,
installcheck_providerorder,
installcheck_stop,
installcheck_done
};
ULONG_PTR RdrInstallCheck( void )
{
TCHAR tszTestPath[_MAX_PATH];
ULONG_PTR teststep;
ULONG len = 0;
ULONG_PTR tc = SETUP_COMPLETE;
HANDLE th;
for ( teststep = installcheck_start; teststep < installcheck_done; teststep++ )
{
switch ( teststep )
{
case installcheck_start:
{
len = GetWindowsDirectory( tszTestPath, _MAX_PATH );
}
break;
case installcheck_driverfile:
{
lstrcpyn( &tszTestPath[len], DRIVER_FILE_PATH, _MAX_PATH - len );
th = CreateFile( tszTestPath, 0, 0, NULL, OPEN_EXISTING, 0, NULL );
if ( th == INVALID_HANDLE_VALUE )
{
tc = SETUP_MISSING_FILE;
teststep = installcheck_stop;
}
else
{
CloseHandle( th );
}
}
break;
case installcheck_providerfile:
{
lstrcpyn( &tszTestPath[len], PROVIDER_FILE_PATH, _MAX_PATH - len );
th = CreateFile( tszTestPath, 0, 0, NULL, OPEN_EXISTING, 0, NULL );
if ( th == INVALID_HANDLE_VALUE )
{
tc = SETUP_MISSING_FILE;
teststep = installcheck_stop;
}
else
{
CloseHandle( th );
}
}
break;
case installcheck_serviceentry:
{
HKEY hTestKey;
if ( OpenKey( RDRSERVICE_KEY, &hTestKey ) )
{
RegCloseKey( hTestKey );
}
else
{
tc = SETUP_INCOMPLETE;
teststep = installcheck_stop;
}
}
break;
case installcheck_providerorder:
{
LPTSTR pOrder;
RdrGetProviderOrderString( &pOrder );
if ( pOrder )
{
if ( !RdrFindProviderInOrder( pOrder, PROVIDER_NAME ) )
{
tc = SETUP_INCOMPLETE;
teststep = installcheck_stop;
}
free( pOrder );
}
}
break;
case installcheck_stop:
break;
}
}
return tc;
}
BOOL RdrCompleteSetup( void )
{
return RdrSetupServiceEntry( ) && RdrSetupProviderOrder( );
}
// These handles are retained
HANDLE hSharedMemory;
HANDLE hMutex;
BOOL RdrStart(void)
/*++
Routine Description:
This routine starts the SMB sample mini redirector.
Notes:
The start is distinguished from Load. During this phase the appropriate FSCTL
is issued and the shared memory/mutex data structures required for the Network
provider DLL are initialized.
--*/
{
HANDLE DeviceHandle; // The mini rdr device handle
DWORD BytesRet;
BOOL started = FALSE;
// Grab a handle to the redirector device object
DbgP((TEXT("Opening Rdr Device Object for Start Ioctl\n")));
DeviceHandle = CreateFile( DD_SMBMRX_USERMODE_DEV_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
DbgP((TEXT("returned from rdr device open\n")));
if ( DeviceHandle != INVALID_HANDLE_VALUE )
{
DbgP(( TEXT("Issueing Rdr Start Ioctl\n") ));
started = DeviceIoControl( DeviceHandle,
IOCTL_SMBMRX_START,
NULL,
0,
NULL,
0,
&BytesRet,
NULL );
// Create a section of shared memory to serve as the connection database
if ( started )
{
DWORD Status;
hSharedMemory = CreateFileMapping( INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
sizeof(SMBMRXNP_SHARED_MEMORY),
SMBMRXNP_SHARED_MEMORY_NAME);
if (hSharedMemory == NULL)
{
Status = GetLastError();
DbgP((TEXT("SMB MRx Net Provider shared memory Creation status %lx\n"),Status));
}
else
{
PSMBMRXNP_SHARED_MEMORY pSharedMemory;
pSharedMemory = MapViewOfFile(hSharedMemory, FILE_MAP_WRITE, 0, 0, 0);
if (pSharedMemory != NULL)
{
pSharedMemory->HighestIndexInUse = -1;
pSharedMemory->NumberOfResourcesInUse = 0;
}
UnmapViewOfFile(pSharedMemory);
}
hMutex = CreateMutex( NULL,
FALSE,
SMBMRXNP_MUTEX_NAME);
if (hMutex == NULL)
{
Status = GetLastError();
DbgP(( TEXT("SMB MRx Net Provider Mutex Creation status %lx\n"), Status));
}
}
else
{
DbgP(( TEXT("The DeviceIoctl for Starting Redirector returned %lx\n"), GetLastError() ));
}
}
else
{
DbgP(( TEXT("The CreateFile for opening device failed with error 0x%lx\n"), GetLastError() ));
DbgP(( TEXT("Device is %s\n"),DD_SMBMRX_USERMODE_DEV_NAME ));
}
//DbgP((TEXT("SMB MRx sample mini redirector start status %lx\n"),ntstatus));
CloseHandle(DeviceHandle);
return started;
}
BOOL RdrStop( void )
/*++
Routine Description:
This routine stops the SMB sample mini redirector.
Notes:
The stop is distinguished from unload. During this phase the appropriate FSCTL
is issued and the shared memory/mutex data structures required for the Network
provider DLL are torn down.
--*/
{
HANDLE DeviceHandle; // The mini rdr device handle
DWORD BytesRet;
BOOL stopped = FALSE;
// Grab a handle to the redirector device object
DeviceHandle = CreateFile( DD_SMBMRX_USERMODE_DEV_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
DbgP((TEXT("Doing Stop DeviceIoControl\n")));
if ( DeviceHandle != INVALID_HANDLE_VALUE )
{
stopped = DeviceIoControl( DeviceHandle,
IOCTL_SMBMRX_STOP,
NULL,
0,
NULL,
0,
&BytesRet,
NULL );
CloseHandle( DeviceHandle );
}
else
{
DbgP(( TEXT("The CreateFile for opening device failed\n") ));
}
CloseHandle(hMutex);
CloseHandle(hSharedMemory);
// DbgP(( TEXT("SMB MRx sample mini redirector start status %lx\n"),ntstatus ));
return stopped;
}
BOOL RdrLoad( void )
{
SC_HANDLE sch, service;
BOOL loaded = FALSE;
DbgP((TEXT("Loading SMB sample minirdr.......\n")));
sch = OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if ( sch )
{
service = OpenService( sch, RDRSERVICE, GENERIC_EXECUTE );
if ( service )
{
loaded = StartService( service, 0, NULL );
CloseServiceHandle( service );
}
CloseServiceHandle( sch );
}
return loaded;
}
BOOL RdrUnload( void )
{
SC_HANDLE sch, service;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -