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

📄 init.c

📁 一个windows 文件系统驱动源码
💻 C
字号:

 /*                                                                            
  *		Copyright (c) 2001 - 2010 Satish Kumar Janarthanan (vsat_in@yahoo.com)
  *
  *		Project:		Win2fs
  *                                                                            
  *		Module Name:	\FSD\Init.c
  *                                                                            
  *		Abstract:		The main entry point for the driver.
  *
  *		Notes:			None.
  *
  *		Revision History:
  *
  *		Date		Version		Author				Change Log
  *		------------------------------------------------------------------------
  *
  *					0.0.1		Satish Kumar J		Initial Version
  */       


 //////////////////////////////////////////////////////////////////////////////

 // Includes.

 #include "ext2fs.h"

 //////////////////////////////////////////////////////////////////////////////

 // Global, External declarations.

 #ifdef ALLOC_PRAGMA
	#pragma alloc_text(INIT, Ext2QueryRegistry)
	#pragma alloc_text(INIT, DriverEntry)
 #endif

 PEXT2_GLOBAL gExt2Global = NULL;

 //////////////////////////////////////////////////////////////////////////////

 // Static data.

 // None.

 //////////////////////////////////////////////////////////////////////////////

 // Static functions.

 static USHORT GetMaxDepth ()
 {
	USHORT lRet = 16;

	ENTER (D_INIT, "GetMaxDepth");

    switch ( MmQuerySystemSize() ) 
	{
	    case MmSmallSystem:
			lRet = 16;
	        break;
	    case MmMediumSystem:
	        lRet = 64;
		    break;
	    case MmLargeSystem:
		    lRet = 256;
			break;
	}

	Ext2DbgPrint (D_INIT, "Leaving GetMaxDepth, returning %u", lRet);

	return lRet;
 }

 static VOID SetupDriverObject (IN PDRIVER_OBJECT DriverObject)
 {
	 ENTER (D_INIT, "SetupDriverObject");

	 if (DriverObject != NULL)
	 {
		Ext2DbgPrint (D_INIT, "Setting up IRP MajorFunction callbacks ...");

		DriverObject->MajorFunction[IRP_MJ_CREATE]              = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_CLOSE]               = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_READ]                = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_WRITE]               = Ext2BuildRequest;

		DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS]       = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_SHUTDOWN]	        = Ext2BuildRequest;

		DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION]   = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION]     = Ext2BuildRequest;

		DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION]    = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_SET_VOLUME_INFORMATION]      = Ext2BuildRequest;

		DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL]   = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]      = Ext2BuildRequest;
		DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL]        = Ext2BuildRequest;

		DriverObject->MajorFunction[IRP_MJ_CLEANUP]             = Ext2BuildRequest;
		DriverObject->DriverUnload                              = NULL;
	 }

	 LEAVE (D_INIT, "SetupDriverObject");
 }

 static VOID SetupDeviceExtension (
		IN PDRIVER_OBJECT DriverObject,
		IN PDEVICE_OBJECT DeviceObject
	)
 {
     PEXT2FS_EXT                 DeviceExt;
	 PFAST_IO_DISPATCH           FastIoDispatch;
     PCACHE_MANAGER_CALLBACKS    CacheManagerCallbacks;

	 ENTER (D_INIT, "SetupDeviceExtension");

	 do
	 {
		BREAK_IF_NULL (DeviceObject);

		Ext2DbgPrint (D_INIT, "Setting up Device Extension ...");
		
		DeviceExt = (PEXT2FS_EXT) DeviceObject->DeviceExtension;
		RtlZeroMemory(DeviceExt, sizeof(EXT2FS_EXT));

		// Setup the gExt2Global structure.	    
		gExt2Global = &(DeviceExt->gExt2Global);
		//TODO: Need to setup gExt2Global->TimeZone here.
		gExt2Global->Identifier.Type = EXT2FGD;
		gExt2Global->Identifier.Size = sizeof(EXT2_GLOBAL);
		gExt2Global->DeviceObject = DeviceObject;
		gExt2Global->DriverObject = DriverObject;
		gExt2Global->MaxDepth = GetMaxDepth ();

		// Initialize the fast I/O entry points
		FastIoDispatch = &(gExt2Global->FastIoDispatch);
		FastIoDispatch->SizeOfFastIoDispatch        = sizeof(FAST_IO_DISPATCH);
		FastIoDispatch->FastIoCheckIfPossible       = Ext2FastIoCheckIfPossible;
	#ifdef DEBUG
		FastIoDispatch->FastIoRead                  = Ext2FastIoRead;
		FastIoDispatch->FastIoWrite                 = Ext2FastIoWrite;
	#else
		FastIoDispatch->FastIoRead                  = FsRtlCopyRead;
		FastIoDispatch->FastIoWrite                 = FsRtlCopyWrite;
	#endif
		FastIoDispatch->FastIoQueryBasicInfo        = Ext2FastIoQueryBasicInfo;
		FastIoDispatch->FastIoQueryStandardInfo     = Ext2FastIoQueryStandardInfo;
		FastIoDispatch->FastIoLock                  = Ext2FastIoLock;
		FastIoDispatch->FastIoUnlockSingle          = Ext2FastIoUnlockSingle;
		FastIoDispatch->FastIoUnlockAll             = Ext2FastIoUnlockAll;
		FastIoDispatch->FastIoUnlockAllByKey        = Ext2FastIoUnlockAllByKey;
		FastIoDispatch->FastIoQueryNetworkOpenInfo  = Ext2FastIoQueryNetworkOpenInfo;

		DriverObject->FastIoDispatch = FastIoDispatch;

		// Initialize the Cache Manager callbacks
		CacheManagerCallbacks = &(gExt2Global->CacheManagerCallbacks);
		CacheManagerCallbacks->AcquireForLazyWrite  = Ext2AcquireForLazyWrite;
		CacheManagerCallbacks->ReleaseFromLazyWrite = Ext2ReleaseFromLazyWrite;
		CacheManagerCallbacks->AcquireForReadAhead  = Ext2AcquireForReadAhead;
		CacheManagerCallbacks->ReleaseFromReadAhead = Ext2ReleaseFromReadAhead;

		gExt2Global->CacheManagerNoOpCallbacks.AcquireForLazyWrite  = Ext2NoOpAcquire;
		gExt2Global->CacheManagerNoOpCallbacks.ReleaseFromLazyWrite = Ext2NoOpRelease;
		gExt2Global->CacheManagerNoOpCallbacks.AcquireForReadAhead  = Ext2NoOpAcquire;
		gExt2Global->CacheManagerNoOpCallbacks.ReleaseFromReadAhead = Ext2NoOpRelease;

		// Initialize the global data
		InitializeListHead(&(gExt2Global->VcbList));
		ExInitializeResourceLite(&(gExt2Global->Resource));

		ExInitializeNPagedLookasideList( &(gExt2Global->Ext2IrpContextLookasideList),
										 NULL,
										 NULL,
										 0,
										 sizeof(EXT2_IRP_CONTEXT),
										 '2TXE',
										 gExt2Global->MaxDepth);

		ExInitializeNPagedLookasideList( &(gExt2Global->Ext2FcbLookasideList),
										 NULL,
										 NULL,
										 0,
										 sizeof(EXT2_FCB),
										 '2TXE',
										 gExt2Global->MaxDepth);

		ExInitializeNPagedLookasideList( &(gExt2Global->Ext2CcbLookasideList),
										 NULL,
										 NULL,
										 0,
										 sizeof(EXT2_CCB),
										 '2TXE',
										 (USHORT)(gExt2Global->MaxDepth << 1));

		ExInitializePagedLookasideList( &(gExt2Global->Ext2McbLookasideList),
										 NULL,
										 NULL,
										 0,
										 sizeof(EXT2_MCB),
										 '2TXE',
										 (USHORT)(gExt2Global->MaxDepth << 1));

	 } while (FALSE);

	 LEAVE (D_INIT, "SetupDeviceExtension");
 }

 //////////////////////////////////////////////////////////////////////////////

 // Global functions.

 NTSTATUS DriverEntry (
		IN PDRIVER_OBJECT   DriverObject,
		IN PUNICODE_STRING  RegistryPath
	)
 {
    PDEVICE_OBJECT              DeviceObject;
    UNICODE_STRING              DeviceName;
    NTSTATUS                    Status;

	Ext2DbgInitialize (DOUT_FILE, "\\??\\C:\\Win2fs.log");

    ENTER (D_INIT, "DriverEntry");

	RtlInitUnicodeString(&DeviceName, DEVICE_NAME);

	do
	{
	    Ext2DbgPrint(D_INIT, "Ext2 File System Driver.");

		Ext2DbgPrint(D_INIT, " " __DATE__ " " __TIME__
 #ifdef DEBUG
			", Checked"
 #endif
			", _WIN32_WINNT=%#x.", _WIN32_WINNT);

		Ext2DbgPrint (D_INIT, "Calling IoCreateDevice ...");

		Status = IoCreateDevice(
					DriverObject,
					sizeof(EXT2FS_EXT),
					&DeviceName,
					FILE_DEVICE_DISK_FILE_SYSTEM,
					0,
					FALSE,
					&DeviceObject );

		BREAK_IF_FAILED (Status);

		SetupDriverObject (DriverObject);

		SetupDeviceExtension (DriverObject, DeviceObject);

 #ifdef DEBUG
		gProcessNameOffset = Ext2GetProcessNameOffset();
 #endif

		Ext2DbgPrint (D_INIT, "Calling IoRegisterFileSystem ...");

	    IoRegisterFileSystem (DeviceObject);
    
	} while (FALSE);

	LEAVE3 (D_INIT, "DriverEntry");
    
    return Status;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -