⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgpwdnt.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*____________________________________________________________________________
	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 + -