📄 srfunc.c
字号:
BOOL unloaded = FALSE;
DbgP((TEXT("Unloading SMB sample minirdr.......\n")));
sch = OpenSCManager( NULL, NULL, GENERIC_EXECUTE );
if ( sch )
{
service = OpenService( sch, RDRSERVICE, GENERIC_EXECUTE );
if ( service )
{
SERVICE_STATUS ss;
unloaded = ControlService( service, SERVICE_CONTROL_STOP, &ss );
CloseServiceHandle( service );
}
CloseServiceHandle( sch );
}
return unloaded;
}
BOOL RdrDoNothing( void )
{
return TRUE;
}
BOOL RdrDoAction( ULONG_PTR action )
{
return (*ActionProcs[action])( );
}
ULONG_PTR RdrGetInitialState(void)
{
ULONG_PTR state = RDR_UNLOADED;
SC_HANDLE sch, service;
sch = OpenSCManager( NULL, NULL, GENERIC_READ );
if ( sch )
{
service = OpenService( sch, RDRSERVICE, GENERIC_READ );
if ( service )
{
SERVICE_STATUS ss;
if ( QueryServiceStatus( service, &ss ) )
{
switch ( ss.dwCurrentState )
{
case SERVICE_STOPPED:
state = RDR_UNLOADED;
break;
case SERVICE_START_PENDING:
state = RDR_LOADING;
break;
case SERVICE_STOP_PENDING:
state = RDR_UNLOADING;
break;
case SERVICE_RUNNING:
state = RDR_LOADED;
break;
case SERVICE_CONTINUE_PENDING:
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
default:
state = RDR_UNLOADED;
break;
}
#if 0 //just check for load/unload state for now
// go check the start/stop state
if ( state == RDR_LOADED )
{
BOOL IsOk;
HANDLE DeviceHandle;
DWORD BytesRet;
ULONG_PTR RdrStateValue;
DeviceHandle = CreateFile( DD_SMBMRX_USERMODE_DEV_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL );
if ( DeviceHandle != INVALID_HANDLE_VALUE )
{
DbgP((TEXT("Doing Get State DeviceIoControl\n")));
IsOk = DeviceIoControl( DeviceHandle,
IOCTL_SMBMRX_GETSTATE,
NULL,
0,
&RdrStateValue,
sizeof(ULONG),
&BytesRet,
NULL );
CloseHandle( DeviceHandle );
}
if ( IsOk )
{
state = RdrStateValue;
}
}
#endif
}
CloseServiceHandle( service );
}
CloseServiceHandle( sch );
}
return state;
}
ULONG_PTR RdrGetNextState( ULONG_PTR Action, ULONG_PTR CurrentState )
{
return ActionsStatesArray[Action][CurrentState];
}
REGENTRY LinkageKeyValues[] =
{
{ TEXT("Bind"), REG_MULTI_SZ, 0, 0 },
{ TEXT("Export"), REG_MULTI_SZ, 0, 0 },
{ TEXT("Route"), REG_MULTI_SZ, 0, 0 }
};
REGENTRY LinkageDisabledKeyValues[] =
{
{ TEXT("Bind"), REG_MULTI_SZ, 0, 0 },
{ TEXT("Export"), REG_MULTI_SZ, 0, 0 },
{ TEXT("Route"), REG_MULTI_SZ, 0, 0 }
};
REGENTRY NetworkProviderKeyValues[] =
{
{
TEXT("Devicename"),
REG_SZ,
sizeof(SMBMRX_DEVICE_NAME),
SMBMRX_DEVICE_NAME
},
{
TEXT("ProviderPath"),
REG_EXPAND_SZ,
sizeof(PROVIDER_PATH),
PROVIDER_PATH
},
{
TEXT("Name"),
REG_SZ,
sizeof(SMBMRX_PROVIDER_NAME),
SMBMRX_PROVIDER_NAME
}
};
REGENTRY ProviderOrderKeyValues[] =
{
{ TEXT("ProviderOrder"), REG_SZ, 0, 0 }
};
BOOL RdrSetupServiceEntry( void )
/*++
Routine Description:
This routine initializes the registry entries for the smbmrx
minirdr. This only needs to be done once.
Arguments:
None
Return Value:
None
--*/
{
HKEY hCurrentKey;
SC_HANDLE sch, service;
BOOL success = TRUE;
DbgP(( TEXT( "Setting up ") RDRSERVICE TEXT(" registry Entries\n" ) ));
sch = OpenSCManager( NULL, NULL, GENERIC_WRITE );
if ( sch )
{
service = CreateService( sch,
RDRSERVICE,
RDRSERVICE,
SERVICE_ALL_ACCESS,
SERVICE_FILE_SYSTEM_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
TEXT("System32\\DRIVERS\\") RDRSERVICE TEXT(".sys"),
TEXT("Network"),
NULL,
NULL,
NULL,
NULL );
if ( service )
{
CloseServiceHandle( service );
}
else if ( GetLastError( ) != ERROR_SERVICE_EXISTS )
{
success = FALSE;
}
CloseServiceHandle( sch );
}
else
{
success = FALSE;
}
// Read the linkage values associated with the Lanman workstation service.
// This contains all the transports and the order in which they need to be used
if ( success && OpenKey( WKSSERVICE_KEY TEXT("\\Linkage"), &hCurrentKey ) )
{
ULONG i;
ReadRegistryKeyValues( hCurrentKey,
sizeof(LinkageKeyValues) / sizeof(REGENTRY),
LinkageKeyValues);
RegCloseKey(hCurrentKey);
// Update the SMB MRx linkage values
if ( CreateKey( RDRSERVICE_KEY TEXT("\\Linkage"), &hCurrentKey ) )
{
WriteRegistryKeyValues( hCurrentKey,
sizeof(LinkageKeyValues) / sizeof(REGENTRY),
LinkageKeyValues);
RegCloseKey(hCurrentKey);
}
else
{
success = FALSE;
}
for ( i = 0; i < ( sizeof(LinkageKeyValues) / sizeof(REGENTRY) ); i++ )
{
if ( LinkageKeyValues[i].pvValue )
{
free( LinkageKeyValues[i].pvValue );
LinkageKeyValues[i].pvValue = NULL;
}
}
}
else
{
success = FALSE;
}
//if ( OpenKey( WKSSERVICE_KEY TEXT("\\Linkage\\Disabled",&hCurrentKey))
//{
// ReadRegistryKeyValues( hCurrentKey,
// sizeof(LinkageDisabledKeyValues) / sizeof(REGENTRY),
// LinkageDisabledKeyValues);
// RegCloseKey(hCurrentKey);
//}
//else
//{
// DbgP(( TEXT("Error Opening Key %s Status %d\n"),WKSSERVICE_KEY TEXT("\\Linkage\\Disabled"),GetLastError() ));
// return;
//}
// Update the SMB MRx linkage disabled values
//if ( CreateKey( RDRSERVICE_KEY TEXT("\\Linkage\\Disabled") ,&hCurrentKey))
//{
// WriteRegistryKeyValues( hCurrentKey,
// sizeof(LinkageDisabledKeyValues)/sizeof(REGENTRY),
// LinkageDisabledKeyValues );
// RegCloseKey(hCurrentKey);
//}
//else
//{
// DbgP(( TEXT("Error Creating Key %s Status %d\n"),RDRSERVICE_KEY TEXT("\\linkage\\disabled",GetLastError() ));
// return;
//}
// Update the SMBmrx network provider section
if ( success && CreateKey( RDRSERVICE_KEY TEXT("\\NetworkProvider"), &hCurrentKey ) )
{
WriteRegistryKeyValues( hCurrentKey,
sizeof(NetworkProviderKeyValues)/sizeof(REGENTRY),
NetworkProviderKeyValues);
RegCloseKey(hCurrentKey);
}
else
{
success = FALSE;
}
if ( success && CreateKey( RDRSERVICE_KEY TEXT("\\Parameters"), &hCurrentKey ) )
{
RegCloseKey( hCurrentKey );
}
else
{
success = FALSE;
}
return success;
}
BOOL RdrSetupProviderOrder( void )
{
LPTSTR pOrderString = NULL;
ULONG_PTR len;
BOOL success = TRUE;
len = RdrGetProviderOrderString( &pOrderString ) * sizeof(TCHAR);
if ( len > 0 && pOrderString )
{
if ( !RdrFindProviderInOrder( pOrderString, PROVIDER_NAME ) )
{
LPTSTR pNewOrderString;
len += sizeof( PROVIDER_NAME ) + (2 * sizeof(TCHAR)); // add 2 for comma delimeter and null
pNewOrderString = malloc( len );
if ( pNewOrderString )
{
lstrcpy( pNewOrderString, pOrderString );
lstrcat( pNewOrderString, TEXT(",") );
lstrcat( pNewOrderString, PROVIDER_NAME );
success = RdrSetProviderOrderString( pNewOrderString );
free( pNewOrderString );
}
}
}
else
{
success = RdrSetProviderOrderString( PROVIDER_NAME );
}
if ( pOrderString )
{
free( pOrderString );
}
return success;
}
ULONG_PTR RdrGetProviderOrderString( LPTSTR *OrderString )
{
HKEY hOrderKey;
ULONG_PTR len = 0;
if ( OpenKey( PROVIDER_ORDER_KEY, &hOrderKey ) )
{
ReadRegistryKeyValues( hOrderKey,
sizeof(ProviderOrderKeyValues) / sizeof(REGENTRY),
ProviderOrderKeyValues);
RegCloseKey(hOrderKey);
len = ProviderOrderKeyValues[0].dwLength / sizeof( TCHAR ) - 1;
*OrderString = (LPTSTR) ProviderOrderKeyValues[0].pvValue;
}
return len;
}
BOOL RdrSetProviderOrderString( LPTSTR OrderString )
{
HKEY hOrderKey;
ULONG len = 0;
BOOL rc = FALSE;
if ( CreateKey( PROVIDER_ORDER_KEY, &hOrderKey ) )
{
ProviderOrderKeyValues[0].dwLength = ( lstrlen( OrderString ) + 1 ) * sizeof( TCHAR );
ProviderOrderKeyValues[0].pvValue = OrderString;
WriteRegistryKeyValues( hOrderKey,
sizeof(ProviderOrderKeyValues) / sizeof(REGENTRY),
ProviderOrderKeyValues);
RegCloseKey(hOrderKey);
rc = TRUE;
}
return rc;
}
BOOL RdrFindProviderInOrder( LPTSTR OrderString, LPTSTR Provider )
{
LPTSTR pCompare;
BOOL match = FALSE;
if ( OrderString && Provider && *Provider )
{
pCompare = Provider;
while ( *OrderString )
{
if ( toupper(*OrderString++) != toupper(*pCompare++) )
{
pCompare = Provider;
}
if ( *pCompare == TEXT('\0') )
{
if ( ( *OrderString == TEXT(',') ) || ( *OrderString == TEXT('\0') ) )
{
match = TRUE;
break;
}
else // hmm, it's a substring of another provider name
{
while ( ( *OrderString != TEXT(',') ) && ( *OrderString != TEXT('\0') ) )
{
OrderString++;
}
pCompare = Provider;
}
}
}
}
return match;
}
void
ReadRegistryKeyValues(
HKEY hCurrentKey,
DWORD NumberOfValues,
PREGENTRY pValues)
/*++
Routine Description:
This routine reads a bunch of values associated with a given key.
Arguments:
hCurrentKey - the key
NumberOfValues - the number of values
pValues - the array of values
Return Value:
None
--*/
{
//
// Iterate through table reading the values along the way
//
DWORD i;
for (i = 0; i < NumberOfValues; i++)
{
DWORD dwType;
LPTSTR pszKey;
dwType = pValues[i].dwType;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -