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

📄 vcd.c

📁 使用DELPHI制作地虚拟光驱
💻 C
字号:
#include <ntddk.h>
#include <ntdef.h>
#include <ntdddisk.h>
#include <ntddcdrm.h>
#include <ntddcdvd.h>
#include <ntverp.h>
#include <stdio.h>
#include <ntifs.h>
#include <DeviceThread.h>
#include <VCD.h>


HANDLE device_root_handle;




NTSTATUS
DriverEntry (
			 IN PDRIVER_OBJECT   DriverObject,
			 IN PUNICODE_STRING  RegistryPath
			 )
{

       NTSTATUS            status = STATUS_SUCCESS;
	   int                 i;
	   UNICODE_STRING      device_dir_name; 
       OBJECT_ATTRIBUTES   object_attributes;


	   DbgPrint("IrpUnload\n"); 

	   //创建设备目录   \\Device
	   RtlInitUnicodeString(&device_dir_name, DEVICE_DIR_NAME);

	   InitializeObjectAttributes(
		   &object_attributes,
		   &device_dir_name,
		   OBJ_PERMANENT,
		   NULL,
		   NULL
		   );
	   status = ZwCreateDirectoryObject(
		   &device_root_handle,                                              
		   DIRECTORY_ALL_ACCESS,                         //全部能力     
		   &object_attributes                            
		   );
	   if (!NT_SUCCESS(status))
	   {
		   DbgPrint("ZwCreateDirectoryObject Failed\n");
		   return status;
	   }
	   //创建临时对象
	   ZwMakeTemporaryObject(device_root_handle); 

	   for (i=0;i< DEVICE_COUNT;i++)
	   {
	      status = IoCreateCDROMDevice(DriverObject, i); 
		  /*
		  if (NT_SUCCESS(status))
		     DbgPrint("IoCreateCDROMDevice OK\n");
		  else
             DbgPrint("IoCreateCDROMDevice Failed\n"); 
          */
	   }

	   DriverObject->MajorFunction[IRP_MJ_CREATE]         = 
	   DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IrpCreateClose;
	  
	   DriverObject->MajorFunction[IRP_MJ_READ]           = 
	   DriverObject->MajorFunction[IRP_MJ_WRITE]          = IrpReadWrite;
	   
	   DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IrpDeviceControl;
	   
       
	   DriverObject->DriverUnload = IrpUnload;
       
	   return STATUS_SUCCESS;
}

//创建CDROM设备,每个设备都会有一个处理线程
NTSTATUS
IoCreateCDROMDevice(
				  IN PDRIVER_OBJECT   DriverObject,
				  IN ULONG            Number
				  )
{
       NTSTATUS            status = STATUS_SUCCESS; 
	   WCHAR               device_name_buffer[MAXIMUM_FILENAME_LENGTH] = {0};
	   UNICODE_STRING      device_name;
	   ANSI_STRING         adevice_name;
	   PDEVICE_OBJECT      device_object;
	   PDEVICE_EXTENSION   device_extension;
	   HANDLE              thread_handle;

	   swprintf(
		   device_name_buffer,
		   DEVICE_FULL_NAME L"%u",
		   Number
		   );
	   RtlInitUnicodeString(&device_name, device_name_buffer);

	   RtlUnicodeStringToAnsiString(&adevice_name, &device_name, TRUE); 
	   DbgPrint("adevice_name:%s\n", adevice_name.Buffer); 
	   RtlFreeAnsiString(&adevice_name);

	   status = IoCreateDevice(
		   DriverObject,
		   sizeof(DEVICE_EXTENSION),
		   &device_name,
		   FILE_DEVICE_CD_ROM,
		   0,
		   FALSE,
		   &device_object
		   );

	   if (!NT_SUCCESS(status))
	   {
		   DbgPrint("IoCreateDevice Failed!\n"); 
		   return status;
	   }
	   device_object->Flags |= DO_DIRECT_IO;
	   device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension;
	   device_extension->index = Number;
	   device_extension->media_in_device = FALSE;

	   device_object->Characteristics |= FILE_READ_ONLY_DEVICE;   //CDROM只能是只读的

	   //初始化线程List
	   InitializeListHead(&device_extension->list_head);
       //初始化自旋锁
	   KeInitializeSpinLock(&device_extension->list_lock);
	   //初始化事件
	   KeInitializeEvent(
		   &device_extension->k_event,
		   SynchronizationEvent,
		   FALSE
		   );
       device_extension->terminate_thread = FALSE;

       //创建系统线程
	   status = PsCreateSystemThread(
		   &thread_handle,
		   (ACCESS_MASK) 0L,
		   NULL,
		   NULL,
		   NULL,
		   DeviceThread,
		   device_object
		   );
	   if (!NT_SUCCESS(status))
	   {
		   IoDeleteDevice(device_object);
		   DbgPrint("PsCreateSystemThread Failed!\n");
		   return status;
	   }
	   status = ObReferenceObjectByHandle(
		   thread_handle,
		   THREAD_ALL_ACCESS,
		   NULL,
		   KernelMode,
		   &device_extension->thread_pointer,
		   NULL
		   );

	   if (!NT_SUCCESS(status))
	   {
		   ZwClose(thread_handle);

		   device_extension->terminate_thread = TRUE;

		   KeSetEvent(
			   &device_extension->k_event,
			   (KPRIORITY) 0,
			   FALSE
			   );

		   IoDeleteDevice(device_object);
           DbgPrint("ObReferenceObjectByHandle Failed!\n");
		   return status;
	   }

	   ZwClose(thread_handle);

	   return  STATUS_SUCCESS;
}



⌨️ 快捷键说明

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