Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

177 lines
3.7 KiB

/*++
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"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, NtfsLoadAddOns)
#pragma alloc_text(PAGE, NtOfsRegisterCallBacks)
#endif
NTSTATUS
EfsInitialization(
void
);
VOID
NtfsLoadAddOns (
IN PDRIVER_OBJECT DriverObject,
IN PVOID Context,
IN ULONG Count
)
/*++
Routine Description:
This routine attempts to initialize the efs support library.
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;
UNREFERENCED_PARAMETER(Context);
UNREFERENCED_PARAMETER(Count);
UNREFERENCED_PARAMETER(DriverObject);
//
// do any efs initialization
// we ignore the status return bedcause there really
// isn't anything we can do about it and ntfs will work
// fine without it.
//
if (!FlagOn( NtfsData.Flags, NTFS_FLAGS_PERSONAL )) {
Status = EfsInitialization();
}
//
// return to 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.
--*/
{
NTSTATUS Status;
PAGED_CODE();
switch (NtfsAddonType) {
case Encryption :
{
Status = STATUS_INVALID_PARAMETER;
//
// Bail if Ntfs has not been initialized.
//
if (SafeNodeType( &NtfsData ) != NTFS_NTC_DATA_HEADER) {
return STATUS_DEVICE_DOES_NOT_EXIST;
} else {
//
// Only allow one encryption driver to register.
//
NtfsLockNtfsData();
if (!FlagOn( NtfsData.Flags, NTFS_FLAGS_ENCRYPTION_DRIVER )) {
ENCRYPTION_CALL_BACK *EncryptionCallBackTable = CallBackTable;
//
// The caller must pass a callback table and the version must be correct.
//
if ((EncryptionCallBackTable != NULL) &&
(EncryptionCallBackTable->InterfaceVersion == ENCRYPTION_CURRENT_INTERFACE_VERSION)) {
//
// Save the call back values.
//
RtlCopyMemory( &NtfsData.EncryptionCallBackTable,
EncryptionCallBackTable,
sizeof( ENCRYPTION_CALL_BACK ));
#ifdef EFSDBG
NtfsData.EncryptionCallBackTable.AfterReadProcess = NtfsDummyEfsRead;
NtfsData.EncryptionCallBackTable.BeforeWriteProcess = NtfsDummyEfsWrite;
#endif
SetFlag( NtfsData.Flags, NTFS_FLAGS_ENCRYPTION_DRIVER );
Status = STATUS_SUCCESS;
}
}
NtfsUnlockNtfsData();
return Status;
}
}
default :
return STATUS_INVALID_PARAMETER;
}
}