All about Programming

[Windows Device Driver] Remove a Drive Letter 드라이브 레터 삭제

민토즈 2021. 6. 7. 17:53
300x250

https://docs.microsoft.com/en-us/windows/win32/fileio/editing-drive-letter-assignments

 

 

Editing Drive Letter Assignments - Win32 apps

How to add or remove persistent drive letter assignments. These drive letter assignments persist through system shutdown.

docs.microsoft.com

Win32 Version 

   szDriveLetterAndSlash[0] = TEXT('D');
   szDriveLetterAndSlash[1] = TEXT(':');
   szDriveLetterAndSlash[2] = TEXT('\\');
   szDriveLetterAndSlash[3] = TEXT('\0');

   RESULT = DeleteVolumeMountPoint (szDriveLetterAndSlash);

 

Kernel Version

	// remove a drive letter --- kernel version 
    UNICODE_STRING			ObjectName;
    OBJECT_ATTRIBUTES	    ObjectAttrs;
    HANDLE					mmhandle;
    IO_STATUS_BLOCK			iosb;
    UNICODE_STRING	    	uniDosName;
    PMOUNTMGR_MOUNT_POINT   pPoint = NULL;
    PCHAR					input, output;
    
    RtlInitUnicodeString(&ObjectName, MOUNTMGR_DEVICE_NAME );

	ObjectAttrs.Length = sizeof(OBJECT_ATTRIBUTES);
	ObjectAttrs.RootDirectory = NULL;
	ObjectAttrs.ObjectName = &ObjectName;
	ObjectAttrs.Attributes = OBJ_CASE_INSENSITIVE;
	ObjectAttrs.SecurityDescriptor = NULL;
	ObjAttrs.SecurityQualityOfService = NULL;
    
    // Get Mount Manager Handle
    status = ZwCreateFile(&mmhandle,
					GENERIC_READ | GENERIC_WRITE,
					&ObjectAttrs,
					&iosb,
					0,
					0,
					FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
					FILE_OPEN,
					FILE_NON_DIRECTORY_FILE,
					NULL,
					0);
                    
    if(!NT_SUCCESS(status))
        return status;
    
    
    RtlInitUnicodeString(&uniDosName,  L"\\DosDevices\\D:");
    
    input = ExAllocatePool(NonPagedPool, 1024);
    if(input == NULL)
    {
    	ZwClose(mmhandle);
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    
    output = ExAllocatePool(NonPagedPool 1024);
    if(output == NULL)
    {
        ZwClose(mmhandle);
        ExFreePool(input);
    	return STATUS_INSUFFICIENT_RESOURCES;
     }
    
    RtlZeroMemory(input, 1024);
    
    pPoint = (PMOUNTMGR_MOUNT_POINT)input;
    pPoint->SymbolicLinkNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
    pPoint->SymbolicLinkNameLength = uniDosName.Length;
    RtlCopyMemory( input + pPoint->SymbolicLinkNameOffset, uniDosName.Buffer, uniDosName.Length);

    RtlZeroMemory(output, 1024);
    
    status = ZwDeviceIoControlFile(mmhandle,
								NULL,
								0,
								0,
								&iosb,
								IOCTL_MOUNTMGR_DELETE_POINTS,
								input,
								sizeof(MOUNTMGR_MOUNT_POINTS) + uniDosName.Length, 
								(PVOID)output, 
								1024);

	if(status == STATUS_PENDING)
		status = iosb.Status;
        
    ZwClose(mmhandle);
    ExFreePool(input);
    ExFreePool(output);
    
    return status;

 

드라이브 레터 삭제 관련해서, kernel 버전으로 drive letter를 삭제하는 방법을 작성해 보았습니다. 

코드를 옮겨오는 과정에서 일부 오류가 있을 수 있습니다. 

 

300x250