📄 devfcb.c
字号:
/*++
Copyright (c) 1989 - 1999 Microsoft Corporation
Module Name:
devfcb.c
Abstract:
This module implements the mechanism for deleting an established connection
--*/
#include "precomp.h"
#pragma hdrstop
//
// The local debug trace level
//
#define Dbg (DEBUG_TRACE_DEVFCB)
#define FIXED_CONNECT_NAME L"\\;0:\\nulsvr\\share"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, NulMRxDevFcbXXXControlFile)
#endif
NTSTATUS
NulMRxDevFcbXXXControlFile (
IN OUT PRX_CONTEXT RxContext
)
/*++
Routine Description:
This routine handles all the device FCB related FSCTL's in the mini rdr
Arguments:
RxContext - Describes the Fsctl and Context.
Return Value:
a valid NTSTATUS code.
Notes:
--*/
{
NTSTATUS Status;
RxCaptureFobx;
UCHAR MajorFunctionCode = RxContext->MajorFunction;
NulMRxGetDeviceExtension(RxContext,pDeviceExtension);
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
ULONG ControlCode = 0;
DbgPrint("NulMRxDevFcb\n");
switch (MajorFunctionCode)
{
case IRP_MJ_FILE_SYSTEM_CONTROL:
{
switch (LowIoContext->ParamsFor.FsCtl.MinorFunction)
{
case IRP_MN_USER_FS_REQUEST:
switch (ControlCode) {
default:
Status = STATUS_INVALID_DEVICE_REQUEST;
}
break;
default : //minor function != IRP_MN_USER_FS_REQUEST
Status = STATUS_INVALID_DEVICE_REQUEST;
}
} // FSCTL case
break;
case IRP_MJ_DEVICE_CONTROL:
{
ControlCode = LowIoContext->ParamsFor.IoCtl.IoControlCode;
switch (ControlCode) {
case IOCTL_NULMRX_ADDCONN:
{
Status = NulMRxCreateConnection( RxContext, &RxContext->PostRequest );
}
break;
case IOCTL_NULMRX_DELCONN:
Status = NulMRxDeleteConnection( RxContext, &RxContext->PostRequest );
break;
case IOCTL_NULMRX_GETLIST:
{
ULONG cbOut = LowIoContext->ParamsFor.IoCtl.OutputBufferLength;
PVOID pbOut = LowIoContext->ParamsFor.IoCtl.pOutputBuffer;
if ( cbOut >= 26 )
{
BOOLEAN GotMutex;
GotMutex = ExTryToAcquireFastMutex( &pDeviceExtension->LCMutex );
RtlCopyMemory( pbOut, pDeviceExtension->LocalConnections, 26 );
if ( GotMutex )
{
ExReleaseFastMutex( &pDeviceExtension->LCMutex );
}
RxContext->InformationToReturn = 26;
}
else
{
RxContext->InformationToReturn = 0;
}
Status = STATUS_SUCCESS;
}
break;
case IOCTL_NULMRX_GETCONN:
{
UNICODE_STRING LookupName;
UNICODE_STRING RemainingName;
LOCK_HOLDING_STATE LockHoldingState;
PVOID Container;
ULONG ReturnedSize = 0;
ULONG ConnectNameLen = LowIoContext->ParamsFor.IoCtl.InputBufferLength;
PWCHAR ConnectName = LowIoContext->ParamsFor.IoCtl.pInputBuffer;
ULONG RemoteNameLen = LowIoContext->ParamsFor.IoCtl.OutputBufferLength;
PULONG RemoteName = LowIoContext->ParamsFor.IoCtl.pOutputBuffer;
PRX_PREFIX_TABLE pRxNetNameTable
= RxContext->RxDeviceObject->pRxNetNameTable;
// insert the local connection name
if ( ConnectNameLen > sizeof( WCHAR ) )
{
PWCHAR pLookupName = ExAllocatePool( PagedPool, sizeof(FIXED_CONNECT_NAME) );
if (pLookupName == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES;
break;
}
RtlCopyMemory( pLookupName, FIXED_CONNECT_NAME, sizeof( FIXED_CONNECT_NAME ) );
pLookupName[2] = ConnectName[0];
LookupName.Buffer = pLookupName;
LookupName.Length = sizeof(FIXED_CONNECT_NAME);
LookupName.MaximumLength = sizeof(FIXED_CONNECT_NAME);
if ( LookupName.Buffer )
{
LockHoldingState = LHS_SharedLockHeld;
RxAcquirePrefixTableLockShared(pRxNetNameTable, TRUE);
Container = RxPrefixTableLookupName(pRxNetNameTable,
&LookupName, &RemainingName, NULL);
if (Container)
{
switch (NodeType(Container))
{
case RDBSS_NTC_V_NETROOT:
{
PMRX_NET_ROOT pNetRoot = ((PV_NET_ROOT)Container)->pNetRoot;
RtlCopyMemory( RemoteName, pNetRoot->pNetRootName->Buffer, pNetRoot->pNetRootName->Length );
ReturnedSize = pNetRoot->pNetRootName->Length;
RxDereferenceVNetRoot((PV_NET_ROOT)Container, LockHoldingState);
}
break;
case RDBSS_NTC_NETROOT:
{
PNET_ROOT pNetRoot = (PNET_ROOT) Container;
RtlCopyMemory( RemoteName, pNetRoot->pNetRootName->Buffer, pNetRoot->pNetRootName->Length );
ReturnedSize = pNetRoot->pNetRootName->Length;
RxDereferenceNetRoot((PNET_ROOT)Container, LockHoldingState);
}
break;
case RDBSS_NTC_SRVCALL:
RxDereferenceSrvCall((PSRV_CALL)Container, LockHoldingState);
ReturnedSize = 0;
break;
default:
RxDereference((PVOID)Container,LockHoldingState);
ReturnedSize = 0;
break;
}
}
RxReleasePrefixTableLock(pRxNetNameTable);
ExFreePool( LookupName.Buffer );
}
}
if ( ReturnedSize )
{
Status = STATUS_SUCCESS;
}
else
{
Status = STATUS_BAD_NETWORK_NAME;
}
RxContext->InformationToReturn = ReturnedSize;
}
break;
default :
Status = STATUS_INVALID_DEVICE_REQUEST;
}
}
break;
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
{
switch (ControlCode) {
default :
Status = STATUS_INVALID_DEVICE_REQUEST;
}
}
break;
default:
ASSERT(!"unimplemented major function");
Status = STATUS_INVALID_DEVICE_REQUEST;
}
DbgPrint("NulMRxDevFcb st,info=%08lx,%08lx\n",
Status,RxContext->InformationToReturn);
return(Status);
}
HANDLE
GetConnectionHandle(
IN PUNICODE_STRING ConnectionName
)
{
NTSTATUS Status;
HANDLE Handle;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING FileName;
// Connection name should get checked to be certain our device is in the path
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -