📄 pgpwdnt.c
字号:
/*____________________________________________________________________________
Copyright (C) 1999 Network Associates, Inc.
All rights reserved.
$Id: PGPwdNT.c,v 1.3 1999/05/11 06:57:14 wjb Exp $
____________________________________________________________________________*/
#include "ntddk.h"
#include "PGPwdNT.h"
#include "..\include\PGPwd.h"
//----------------------------------------------------------------------
// FORWARD DEFINES
//----------------------------------------------------------------------
//
// Undocumented ntoskrnl variable
//
extern PSHORT NtBuildNumber;
//
// File name information
//
typedef struct _FILE_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
NTSTATUS PGPWDNTDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
//
// These are prototypes for PGPWDNT's Fast I/O hooks. The originals
// prototypes can be found in NTDDK.H
//
BOOLEAN PGPWDNTFastIoCheckifPossible( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN BOOLEAN CheckForReadOperation,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoRead( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoWrite( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoQueryBasicInfo( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
OUT PFILE_BASIC_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoQueryStandardInfo( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
OUT PFILE_STANDARD_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoLock( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key,
BOOLEAN FailImmediately, BOOLEAN ExclusiveLock,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoUnlockSingle( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoUnlockAll( IN PFILE_OBJECT FileObject, PEPROCESS ProcessId,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoUnlockAllByKey( IN PFILE_OBJECT FileObject, PEPROCESS ProcessId, ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoDeviceControl( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
IN PVOID InputBuffer, IN ULONG InputBufferLength,
OUT PVOID OutbufBuffer, IN ULONG OutputBufferLength, IN ULONG IoControlCode,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject );
VOID PGPWDNTFastIoAcquireFile( PFILE_OBJECT FileObject );
VOID PGPWDNTFastIoReleaseFile( PFILE_OBJECT FileObject );
VOID PGPWDNTFastIoDetachDevice( PDEVICE_OBJECT SourceDevice, PDEVICE_OBJECT TargetDevice );
//
// These are new NT 4.0 Fast I/O calls
//
BOOLEAN PGPWDNTFastIoQueryNetworkOpenInfo(IN PFILE_OBJECT FileObject,
IN BOOLEAN Wait, OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
OUT struct _IO_STATUS_BLOCK *IoStatus, IN PDEVICE_OBJECT DeviceObject );
NTSTATUS PGPWDNTFastIoAcquireForModWrite( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER EndingOffset, OUT struct _ERESOURCE **ResourceToRelease,
IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoMdlRead( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN ULONG Length,
IN ULONG LockKey, OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoMdlReadComplete( IN PFILE_OBJECT FileObject,
IN PMDL MdlChain, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoPrepareMdlWrite( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG LockKey,
OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoMdlWriteComplete( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoReadCompressed( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN ULONG Length,
IN ULONG LockKey, OUT PVOID Buffer, OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
IN ULONG CompressedDataInfoLength, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoWriteCompressed( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN ULONG Length,
IN ULONG LockKey, IN PVOID Buffer, OUT PMDL *MdlChain,
OUT PIO_STATUS_BLOCK IoStatus,
IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
IN ULONG CompressedDataInfoLength, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoMdlReadCompleteCompressed( IN PFILE_OBJECT FileObject,
IN PMDL MdlChain, IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoMdlWriteCompleteCompressed( IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain,
IN PDEVICE_OBJECT DeviceObject );
BOOLEAN PGPWDNTFastIoQueryOpen( IN struct _IRP *Irp,
OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
IN PDEVICE_OBJECT DeviceObject );
NTSTATUS PGPWDNTFastIoReleaseForModWrite( IN PFILE_OBJECT FileObject,
IN struct _ERESOURCE *ResourceToRelease, IN PDEVICE_OBJECT DeviceObject );
NTSTATUS PGPWDNTFastIoAcquireForCcFlush( IN PFILE_OBJECT FileObject,
IN PDEVICE_OBJECT DeviceObject );
NTSTATUS PGPWDNTFastIoReleaseForCcFlush( IN PFILE_OBJECT FileObject,
IN PDEVICE_OBJECT DeviceObject );
//----------------------------------------------------------------------
// GLOBALS
//----------------------------------------------------------------------
//
// This is PGPWDNT's user-inteface device object. It is addressed
// by calls from the GUI including CreateFile and DeviceIoControl
//
PDEVICE_OBJECT GUIDevice;
//
// Mutex that is shared with GUI to synchronize access to the
// PGPWDNT bins
//
PKMUTEX PGPWDNTMutex = NULL;
//
// Table of our hook devices for each drive letter. This makes it
// easy to look up the device object that was created to hook a
// particular drive.
//
PDEVICE_OBJECT LDriveDevices[26];
//
// System process
//
PEPROCESS SystemProcess;
ULONG tc_callback=0;
PKTHREAD tc_thread=0;
//
// This PGPWDNT's Fast I/O dispatch table. Note that NT assumes that
// file system drivers support some Fast I/O calls, so this table must
// be present for an file system filter driver
//
FAST_IO_DISPATCH FastIOHook = {
sizeof(FAST_IO_DISPATCH),
PGPWDNTFastIoCheckifPossible,
PGPWDNTFastIoRead,
PGPWDNTFastIoWrite,
PGPWDNTFastIoQueryBasicInfo,
PGPWDNTFastIoQueryStandardInfo,
PGPWDNTFastIoLock,
PGPWDNTFastIoUnlockSingle,
PGPWDNTFastIoUnlockAll,
PGPWDNTFastIoUnlockAllByKey,
PGPWDNTFastIoDeviceControl,
PGPWDNTFastIoAcquireFile,
PGPWDNTFastIoReleaseFile,
PGPWDNTFastIoDetachDevice,
//
// new for NT 4.0
//
PGPWDNTFastIoQueryNetworkOpenInfo,
PGPWDNTFastIoAcquireForModWrite,
PGPWDNTFastIoMdlRead,
PGPWDNTFastIoMdlReadComplete,
PGPWDNTFastIoPrepareMdlWrite,
PGPWDNTFastIoMdlWriteComplete,
PGPWDNTFastIoReadCompressed,
PGPWDNTFastIoWriteCompressed,
PGPWDNTFastIoMdlReadCompleteCompressed,
PGPWDNTFastIoMdlWriteCompleteCompressed,
PGPWDNTFastIoQueryOpen,
PGPWDNTFastIoReleaseForModWrite,
PGPWDNTFastIoAcquireForCcFlush,
PGPWDNTFastIoReleaseForCcFlush
};
//----------------------------------------------------------------------
// F A S T I O R O U T I N E S
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//
// PGPWDNTFastIoCheckIfPossible
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoCheckifPossible( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN BOOLEAN CheckForReadOperation,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoCheckIfPossible ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoCheckIfPossible(
FileObject, FileOffset, Length,
Wait, LockKey, CheckForReadOperation, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoRead
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoRead( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoRead ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoRead(
FileObject, FileOffset, Length,
Wait, LockKey, Buffer, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoWrite
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoWrite( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoWrite ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoWrite(
FileObject, FileOffset, Length, Wait, LockKey,
Buffer, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoQueryBasicinfo
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoQueryBasicInfo( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
OUT PFILE_BASIC_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoQueryBasicInfo ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoQueryBasicInfo(
FileObject, Wait, Buffer, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoQueryStandardInfo
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoQueryStandardInfo( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
OUT PFILE_STANDARD_INFORMATION Buffer,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoQueryStandardInfo ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoQueryStandardInfo(
FileObject, Wait, Buffer, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoLock
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoLock( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key,
BOOLEAN FailImmediately, BOOLEAN ExclusiveLock,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoLock ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoLock(
FileObject, FileOffset, Length, ProcessId, Key, FailImmediately,
ExclusiveLock, IoStatus, hookExt->FileSystem );
}
return retval;
}
//----------------------------------------------------------------------
//
// PGPWDNTFastIoUnlockSingle
//
//----------------------------------------------------------------------
BOOLEAN PGPWDNTFastIoUnlockSingle( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset,
IN PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key,
OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
PHOOK_EXTENSION hookExt;
hookExt = DeviceObject->DeviceExtension;
if( hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoUnlockSingle ) {
retval = hookExt->FileSystem->DriverObject->FastIoDispatch->FastIoUnlockSingle(
FileObject, FileOffset, Length, ProcessId, Key,
IoStatus, hookExt->FileSystem );
}
return retval;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -