vdkdelete.c

来自「Virtual Disk Driver」· C语言 代码 · 共 162 行

C
162
字号
/*	vdkdelete.c	Virtual Disk kernel-mode driver for Windows NT platform	Delete disk/partition device objects	Copyright (C) 2003 Ken Kato*/#include "vdkbase.h"#include "vdkutil.h"#include "vdkaccess.h"#include "imports.h"#include "vdkdrv.h"#ifdef ALLOC_PRAGMA#pragma alloc_text(PAGE, VdkDeleteDevice)#endif	// ALLOC_PRAGMA////	delete a device object//VOIDVdkDeleteDevice(	IN PDEVICE_OBJECT	DeviceObject){	PPART_EXTENSION	part_extension;	VDKTRACE(VDKDELETE | VDKINFO,		("[VDK] VdkDeleteDevice\n"));	part_extension =		(PPART_EXTENSION)DeviceObject->DeviceExtension;	//	// Release resourse common to disks and partitions	//	VDKTRACE(VDKDELETE | VDKINFO,		("[VDK] Deleting %ws\n",		part_extension->DeviceName.Buffer));	if (part_extension->DeviceName.Buffer) {		ExFreePool(part_extension->DeviceName.Buffer);		RtlZeroMemory			(&part_extension->DeviceName,			sizeof(part_extension->DeviceName));	}	if (part_extension->SymbolicLink.Buffer) {		VDKTRACE(VDKDELETE | VDKINFO,			("[VDK] Deleting Symbolic link %ws\n",			part_extension->SymbolicLink.Buffer));		IoDeleteSymbolicLink(&part_extension->SymbolicLink);		ExFreePool(part_extension->SymbolicLink.Buffer);		RtlZeroMemory			(&part_extension->SymbolicLink,			sizeof(part_extension->SymbolicLink));	}	if (part_extension == (PPART_EXTENSION)part_extension->FirstPartition) {		//	This is a disk device object		PDISK_EXTENSION disk_extension = (PDISK_EXTENSION)part_extension;		// Delete and release all resources that might be created		//		// - Disk device thread		// - Image file information		// - Symbolic link		// - Directory object		//		//		// Close the image files		//		if (disk_extension->DiskInfo.DiskType) {			VdkCloseDisk(&disk_extension->DiskInfo);		}		//		// Terminate disk device thread		//		VDKTRACE(VDKDELETE | VDKINFO,			("[VDK] Terminating device thread\n"));		disk_extension->TerminateThread = TRUE;		KeSetEvent(			&disk_extension->RequestEvent,			(KPRIORITY) 0,			FALSE);		KeWaitForSingleObject(			disk_extension->ThreadPointer,			Executive,			KernelMode,			FALSE,			NULL);		ObDereferenceObject(disk_extension->ThreadPointer);#ifdef VDK_SUPPORT_NETWORK		//		// Delete security context object		//		if (disk_extension->SecurityContext) {			VDKTRACE(VDKDELETE | VDKINFO,				("[VDK] Freeing security context\n"));			SeDeleteClientSecurity(disk_extension->SecurityContext);			ExFreePool(disk_extension->SecurityContext);			RtlZeroMemory				(&disk_extension->SecurityContext,				sizeof(disk_extension->SecurityContext));		}#endif	// VDK_SUPPORT_NETWORK		//		// Delete default symbolic links		//		if (disk_extension->AnotherLink.Buffer) {			VDKTRACE(VDKDELETE | VDKINFO,				("[VDK] Deleting Symbolic link %ws\n",				disk_extension->AnotherLink.Buffer));			IoDeleteSymbolicLink(&disk_extension->AnotherLink);			ExFreePool(disk_extension->AnotherLink.Buffer);			RtlZeroMemory				(&disk_extension->AnotherLink,				sizeof(disk_extension->AnotherLink));		}		//		// Delete the directory object		//		if (disk_extension->DirectoryHandle) {			VDKTRACE(VDKDELETE | VDKINFO,				("[VDK] Closing directory handle\n"));			ZwClose(disk_extension->DirectoryHandle);		}		IoGetConfigurationInformation()->DiskCount--;	}	//	// Delete the device object	//	IoDeleteDevice(DeviceObject);	return;}

⌨️ 快捷键说明

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