📄 devfcb.c
字号:
InitializeObjectAttributes(
&ObjectAttributes,
ConnectionName,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
Status = ZwCreateFile(
&Handle,
SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
NULL, // Allocation size
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN_IF,
FILE_CREATE_TREE_CONNECTION | FILE_SYNCHRONOUS_IO_NONALERT,
NULL, // Ptr to EA Buffer
0); // Length of EA buffer
DbgPrint("ZwCreateFile returned %lx\n",Status);
if ( (STATUS_SUCCESS == Status) && (INVALID_HANDLE_VALUE != Handle) ) {
DbgPrint("ZwCreateFile returned success\n");
}
else
Handle = INVALID_HANDLE_VALUE;
return Handle;
}
NTSTATUS
DoCreateConnection(
IN PRX_CONTEXT RxContext,
ULONG CreateDisposition
)
{
NTSTATUS Status = STATUS_SUCCESS;
HANDLE Handle;
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
ULONG ConnectNameLen = LowIoContext->ParamsFor.IoCtl.InputBufferLength;
PWCHAR ConnectName = LowIoContext->ParamsFor.IoCtl.pInputBuffer;
UNICODE_STRING FileName;
NulMRxGetDeviceExtension(RxContext,pDeviceExtension);
// The sample code passes in only the filename in the Ioctl data buffer.
// An actual implementation could pass in stuff like EAs, security
// credentials, etc
RxDbgTrace(0, Dbg,("DoCreateConnection"));
FileName.Buffer = ConnectName;
FileName.Length = (USHORT) ConnectNameLen;
FileName.MaximumLength = (USHORT) ConnectNameLen;
Handle = GetConnectionHandle(&FileName);
if ( INVALID_HANDLE_VALUE != Handle )
{
PWCHAR pwcLC;
ULONG i;
DbgPrint("GetConnectionHandle returned success\n");
ZwClose(Handle);
for ( i = 0, pwcLC = (PWCHAR) ConnectName; i < ConnectNameLen && *pwcLC!= L':'; i+=sizeof(WCHAR), pwcLC++ );
if ( i >= sizeof(WCHAR) && i < ConnectNameLen )
{
pwcLC--;
if ( *pwcLC >= L'A' && *pwcLC <= L'Z' )
{
ExAcquireFastMutex( &pDeviceExtension->LCMutex );
pDeviceExtension->LocalConnections[*pwcLC - L'A'] = TRUE;
ExReleaseFastMutex( &pDeviceExtension->LCMutex );
}
}
}
else
{
DbgPrint("GetConnectionHandle returned failure\n");
Status = STATUS_BAD_NETWORK_NAME;
}
return(Status);
}
NTSTATUS
NulMRxCreateConnection (
IN PRX_CONTEXT RxContext,
OUT PBOOLEAN PostToFsp
)
/*++
Routine Description:
Arguments:
IN PRX_CONTEXT RxContext - Describes the Fsctl and Context....for later when i need the buffers
Return Value:
RXSTATUS
--*/
{
NTSTATUS Status = STATUS_SUCCESS;
BOOLEAN Wait = BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_WAIT);
BOOLEAN InFSD = !BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_IN_FSP);
PAGED_CODE();
DbgPrint("NulMrxCreateConnection called\n");
RxDbgTrace(+1, Dbg, ("NulMRxCreateConnection \n"));
if (!Wait) {
//just post right now!
*PostToFsp = TRUE;
return STATUS_PENDING;
}
Status = DoCreateConnection(RxContext, (ULONG)FILE_OPEN_IF);
return Status;
}
NTSTATUS
DoDeleteConnection(
PUNICODE_STRING FileName
)
{
HANDLE Handle;
NTSTATUS Status = STATUS_INVALID_HANDLE;
PFILE_OBJECT pFileObject;
PNET_ROOT NetRoot;
PV_NET_ROOT VNetRoot;
PFOBX Fobx;
Handle = GetConnectionHandle(FileName);
if ( INVALID_HANDLE_VALUE != Handle ) {
DbgPrint("GetConnectionHandle returned success\n");
Status = ObReferenceObjectByHandle(
Handle,
0L,
NULL,
KernelMode,
(PVOID *)&pFileObject,
NULL);
DbgPrint("ObReferenceObjectByHandle worked ok\n");
if ( NT_SUCCESS(Status) ) {
// Got the FileObject. Now get an Fobx
Fobx = pFileObject->FsContext2;
if (NodeType(Fobx)==RDBSS_NTC_V_NETROOT) {
VNetRoot = (PV_NET_ROOT)(Fobx);
NetRoot = (PNET_ROOT)VNetRoot->NetRoot;
DbgPrint("Calling RxFinalizeConnection\n");
Status = RxFinalizeConnection(NetRoot,VNetRoot,TRUE);
} else {
ASSERT(FALSE);
Status = STATUS_INVALID_DEVICE_REQUEST;
}
ObDereferenceObject(pFileObject);
}
ZwClose(Handle);
}
return Status;
}
NTSTATUS
NulMRxDeleteConnection (
IN PRX_CONTEXT RxContext,
OUT PBOOLEAN PostToFsp
)
/*++
Routine Description:
This routine deletes a single vnetroot.
Arguments:
IN PRX_CONTEXT RxContext - Describes the Fsctl and Context....for later when i need the buffers
Return Value:
RXSTATUS
--*/
{
NTSTATUS Status;
UNICODE_STRING FileName;
BOOLEAN Wait = BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_WAIT);
PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext;
PWCHAR ConnectName = LowIoContext->ParamsFor.IoCtl.pInputBuffer;
ULONG ConnectNameLen = LowIoContext->ParamsFor.IoCtl.InputBufferLength;
NulMRxGetDeviceExtension(RxContext,pDeviceExtension);
PAGED_CODE();
//RxDbgTrace(+1, Dbg, ("NulMRxDeleteConnection Fobx %08lx\n", capFobx));
if (!Wait) {
//just post right now!
*PostToFsp = TRUE;
return(STATUS_PENDING);
}
FileName.Buffer = ConnectName;
FileName.Length = (USHORT) ConnectNameLen;
FileName.MaximumLength = (USHORT) ConnectNameLen;
Status = DoDeleteConnection(&FileName);
if ( NT_SUCCESS(Status) ) {
PWCHAR pwcLC;
ULONG i;
for ( i = 0, pwcLC = ConnectName; i < ConnectNameLen && *pwcLC!= L':';
i+=sizeof(WCHAR), pwcLC++ );
if ( i >= sizeof(WCHAR) && i < ConnectNameLen )
{
pwcLC--;
if ( *pwcLC >= L'A' && *pwcLC <= L'Z' )
{
ExAcquireFastMutex( &pDeviceExtension->LCMutex );
pDeviceExtension->LocalConnections[*pwcLC - L'A'] = FALSE;
ExReleaseFastMutex( &pDeviceExtension->LCMutex );
}
}
}
return Status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -