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
'All about Programming' 카테고리의 다른 글
Visual Studio 2022 License key 제거 후 다시 등록 (0) | 2023.04.07 |
---|---|
python으로 xml element value 변경 (0) | 2021.01.19 |
python version 확인 및 기타 버전 확인 정리 (0) | 2021.01.19 |
Docker(도커) 명령어 모음 (0) | 2021.01.11 |
docker pull 실행 후 permission denied 에러 발생 (0) | 2021.01.11 |