257 lines
5.0 KiB
C
257 lines
5.0 KiB
C
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Ntfsexp.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the exported routines for Ntfs
|
||
|
||
Author:
|
||
|
||
Jeff Havens [JHavens] 20-Dec-1995
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "NtfsProc.h"
|
||
|
||
#define NTFS_SERVICE_KEY L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
|
||
|
||
PWSTR NtfsAddonNames [] = {
|
||
L"NTFSQ",
|
||
L"VIEWS",
|
||
NULL
|
||
};
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(PAGE, NtfsLoadAddOns)
|
||
#pragma alloc_text(PAGE, NtOfsRegisterCallBacks)
|
||
#endif
|
||
|
||
|
||
VOID
|
||
NtfsLoadAddOns (
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PVOID Context,
|
||
IN ULONG Count
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine attempts to load any NTFS add-ons and notify them about
|
||
any previously mounted volumes.
|
||
|
||
Arguments:
|
||
|
||
DriverObject - Driver object for NTFS
|
||
|
||
Context - Unused, required by I/O system.
|
||
|
||
Count - Unused, required by I/O system.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS Status;
|
||
UNICODE_STRING UnicodeString;
|
||
ULONG i;
|
||
WCHAR Buffer[80];
|
||
|
||
TOP_LEVEL_CONTEXT TopLevelContext;
|
||
PTOP_LEVEL_CONTEXT ThreadTopLevelContext;
|
||
|
||
IRP_CONTEXT LocalIrpContext;
|
||
IRP LocalIrp;
|
||
|
||
PIRP_CONTEXT IrpContext;
|
||
|
||
PLIST_ENTRY Links;
|
||
PVCB Vcb;
|
||
|
||
PVCB VcbForTearDown = NULL;
|
||
BOOLEAN AcquiredGlobal = FALSE;
|
||
|
||
PAGED_CODE();
|
||
|
||
UNREFERENCED_PARAMETER(Context);
|
||
UNREFERENCED_PARAMETER(Count);
|
||
UNREFERENCED_PARAMETER(DriverObject);
|
||
|
||
//
|
||
// For each add-on try to load it.
|
||
//
|
||
|
||
for (i = 0; NtfsAddonNames[i] != NULL; i++) {
|
||
|
||
wcscpy(Buffer, NTFS_SERVICE_KEY);
|
||
wcscat(Buffer, NtfsAddonNames[i]);
|
||
|
||
RtlInitUnicodeString( &UnicodeString, Buffer);
|
||
|
||
Status = ZwLoadDriver( &UnicodeString );
|
||
|
||
#if DBG
|
||
DbgPrint("NtfsLoadAddOns: Loaded module %ws. Status = 0x%lx\n", Buffer, Status);
|
||
#endif
|
||
|
||
}
|
||
|
||
RtlZeroMemory( &LocalIrpContext, sizeof(LocalIrpContext) );
|
||
RtlZeroMemory( &LocalIrp, sizeof(LocalIrp) );
|
||
|
||
IrpContext = &LocalIrpContext;
|
||
IrpContext->NodeTypeCode = NTFS_NTC_IRP_CONTEXT;
|
||
IrpContext->NodeByteSize = sizeof(IRP_CONTEXT);
|
||
IrpContext->OriginatingIrp = &LocalIrp;
|
||
SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT);
|
||
InitializeListHead( &IrpContext->ExclusiveFcbList );
|
||
|
||
//
|
||
// Make sure we don't get any pop-ups
|
||
//
|
||
|
||
ThreadTopLevelContext = NtfsSetTopLevelIrp( &TopLevelContext, TRUE, FALSE );
|
||
ASSERT( ThreadTopLevelContext == &TopLevelContext );
|
||
|
||
(VOID) ExAcquireResourceShared( &NtfsData.Resource, TRUE );
|
||
AcquiredGlobal = TRUE;
|
||
|
||
try {
|
||
|
||
NtfsUpdateIrpContextWithTopLevel( IrpContext, ThreadTopLevelContext );
|
||
|
||
try {
|
||
|
||
for (Links = NtfsData.VcbQueue.Flink;
|
||
Links != &NtfsData.VcbQueue;
|
||
Links = Links->Flink) {
|
||
|
||
Vcb = CONTAINING_RECORD(Links, VCB, VcbLinks);
|
||
|
||
IrpContext->Vcb = Vcb;
|
||
|
||
if (FlagOn( Vcb->VcbState, VCB_STATE_VOLUME_MOUNTED )) {
|
||
|
||
Status = CiMountVolume( Vcb, IrpContext);
|
||
|
||
// Bugbug: What should we do if this fails?
|
||
// BugBug: add call out for views.
|
||
|
||
NtfsCommitCurrentTransaction( IrpContext );
|
||
|
||
}
|
||
}
|
||
|
||
} except(NtfsExceptionFilter( IrpContext, GetExceptionInformation() )) {
|
||
|
||
NOTHING;
|
||
}
|
||
|
||
} finally {
|
||
|
||
if (AcquiredGlobal) {
|
||
ExReleaseResource( &NtfsData.Resource );
|
||
}
|
||
|
||
NtfsRestoreTopLevelIrp( ThreadTopLevelContext );
|
||
}
|
||
|
||
//
|
||
// And return to our caller
|
||
//
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
NTSTATUS
|
||
NtOfsRegisterCallBacks (
|
||
NTFS_ADDON_TYPES NtfsAddonType,
|
||
PVOID CallBackTable
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is called by one of the NTFS add-ons to register its
|
||
callback routines. These routines are call by NTFS at the appropriate
|
||
times.
|
||
|
||
Arguments:
|
||
|
||
NtfsAddonType - Indicates the type of callback table.
|
||
|
||
CallBackTable - Pointer to call back routines for addon.
|
||
|
||
Return Value:
|
||
|
||
Returns a status indicating if the callbacks were accepted.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
if (NtfsAddonType == ContentIndex) {
|
||
|
||
CI_CALL_BACK *CiCallBackTable = CallBackTable;
|
||
|
||
//
|
||
// Validate version number.
|
||
//
|
||
|
||
if (CiCallBackTable->CiInterfaceVersion !=
|
||
CI_CURRENT_INTERFACE_VERSION) {
|
||
|
||
return STATUS_INVALID_PARAMETER;
|
||
}
|
||
|
||
//
|
||
// Save the call back values.
|
||
//
|
||
|
||
NtfsData.CiCallBackTable = CiCallBackTable;
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|
||
|
||
if (NtfsAddonType == Views) {
|
||
|
||
VIEW_CALL_BACK *ViewCallBackTable = CallBackTable;
|
||
|
||
//
|
||
// Validate version number.
|
||
//
|
||
|
||
if (ViewCallBackTable != NULL &&
|
||
ViewCallBackTable->ViewInterfaceVersion !=
|
||
VIEW_CURRENT_INTERFACE_VERSION) {
|
||
|
||
return STATUS_INVALID_PARAMETER;
|
||
}
|
||
|
||
//
|
||
// Save the call back values.
|
||
//
|
||
|
||
NtfsData.ViewCallBackTable = ViewCallBackTable;
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|
||
|
||
return STATUS_INVALID_PARAMETER;
|
||
|
||
}
|