filePathLinkW(const wstring& path) :m_ntType(L"\\??\\") { if (path.length() > 4 && path.substr(0, 4) == L"\\??\\") { m_ntType.append(path.substr(4)); } else { m_ntType.append(path); } static DWORD tick = 0; wchar_t tmpBuffer[100]; StringCbPrintfW(tmpBuffer, 100, L"%x%x%x%x", GetCurrentThreadId(), GetTickCount(), rand(), ++tick); m_pathDefine = wstring(FS_BYPASS_DEFINE_PREFIX_W) + tmpBuffer; if (DefineDosDeviceW(DDD_RAW_TARGET_PATH, m_pathDefine.c_str(), m_ntType.c_str())) { m_pathLink = wstring(L"\\\\.\\") + FS_BYPASS_DEFINE_PREFIX_W + tmpBuffer; m_transformed = true; } else { m_pathLink = path; m_transformed = false; } }
~filePathLinkW() { if (m_transformed) { DWORD err = GetLastError(); DefineDosDeviceW(DDD_REMOVE_DEFINITION, m_pathDefine.c_str(), m_ntType.c_str()); SetLastError(err); } }
/* * @implemented */ BOOL WINAPI DefineDosDeviceA( DWORD dwFlags, LPCSTR lpDeviceName, LPCSTR lpTargetPath ) { UNICODE_STRING DeviceNameU = {0}; UNICODE_STRING TargetPathU = {0}; BOOL Result; if (lpDeviceName && ! RtlCreateUnicodeStringFromAsciiz(&DeviceNameU, (LPSTR)lpDeviceName)) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } if (lpTargetPath && ! RtlCreateUnicodeStringFromAsciiz(&TargetPathU, (LPSTR)lpTargetPath)) { if (DeviceNameU.Buffer) { RtlFreeHeap(RtlGetProcessHeap (), 0, DeviceNameU.Buffer); } SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } Result = DefineDosDeviceW(dwFlags, DeviceNameU.Buffer, TargetPathU.Buffer); if (TargetPathU.Buffer) { RtlFreeHeap(RtlGetProcessHeap (), 0, TargetPathU.Buffer); } if (DeviceNameU.Buffer) { RtlFreeHeap(RtlGetProcessHeap (), 0, DeviceNameU.Buffer); } return Result; }
int SetParallelState(int nPortNum) { WCHAR szPortName[MAX_PORTNAME_LEN]; WCHAR szTargetPath[MAX_PORTNAME_LEN]; swprintf(szPortName, L"LPT%d", nPortNum); swprintf(szTargetPath, L"COM%d", nPortNum); if (!DefineDosDeviceW(DDD_REMOVE_DEFINITION, szPortName, szTargetPath)) { wprintf(L"SetParallelState(%d) - DefineDosDevice(%s) failed: 0x%lx\n", nPortNum, szPortName, GetLastError()); } return 0; }
int _tmain(int argc, _TCHAR* argv[]) { std::wstring symlink; std::wstring target; if (argc < 3) { printf("Usage: CreateDosDeviceSymlink [-d] symlink [target]\n"); printf("Options:\n"); printf("-d : Delete the symlink\n"); return 1; } if (wcscmp(argv[1], L"-d") == 0) { symlink = MakeSymlink(argv[2]); if (argc > 3) { target = argv[3]; } if (DefineDosDeviceW(DDD_NO_BROADCAST_SYSTEM | DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, symlink.c_str(), target.size() > 0 ? target.c_str() : nullptr)) { printf("Removed symlink\n"); } else { printf("Error removing symlink: %ls\n", GetErrorMessage().c_str()); } } else { symlink = MakeSymlink(argv[1]); target = argv[2]; if (DefineDosDevice(DDD_NO_BROADCAST_SYSTEM | DDD_RAW_TARGET_PATH, symlink.c_str(), target.c_str())) { printf("Created symlink\n"); } else { printf("Error creating symlink: %ls\n", GetErrorMessage().c_str()); } } return 0; }
VOID CreateRamDisk( UINT32 Size, CHAR DriveLetter ) { RAMDISK_CREATE_DATA createData = { 0 }; WCHAR mountPoint[] = L" :"; NTSTATUS status; createData.DriveLetter = DriveLetter; createData.DiskGeometry.Cylinders.QuadPart = Size; status = R0CreateRamDisk(&createData); if (!NT_SUCCESS(status)) { if (status = STATUS_SECTION_TOO_BIG) { MessageBoxW( NULL, L"Not enough memory to create ram disk.\n" L"Please upgrade RAM.", L"Push", NULL ); return; } } mountPoint[0] = DriveLetter; DefineDosDeviceW( DDD_RAW_TARGET_PATH, mountPoint, PUSH_RAMDISK_DEVICE_NAME ); }
VOID RemoveRamDisk() { WCHAR mountPoint[] = L" :"/*, cDriveLetter = 0*/; VOID *deviceHandle = 0; IO_STATUS_BLOCK isb; RAMDISK_CREATE_DATA createData = { 0 }; deviceHandle = OpenRamDisk(); if (deviceHandle == INVALID_HANDLE_VALUE) return; /*cDriveLetter = GetRamDiskDriveLetter( deviceHandle );*/ R0QueryRamDisk(deviceHandle, &createData); /*if(cDriveLetter == 0) return;*/ if (createData.DriveLetter == NULL) //could not get a drive letter, return. return; //szMountPoint[0] = cDriveLetter; mountPoint[0] = createData.DriveLetter; FlushFileBuffers(deviceHandle); NtDeviceIoControlFile( deviceHandle, NULL, NULL, NULL, &isb, FSCTL_LOCK_VOLUME, NULL, NULL, NULL, NULL ); NtDeviceIoControlFile( deviceHandle, NULL, NULL, NULL, &isb, FSCTL_DISMOUNT_VOLUME, NULL, NULL, NULL, NULL ); NtDeviceIoControlFile( deviceHandle, NULL, NULL, NULL, &isb, IOCTL_STORAGE_EJECT_MEDIA, NULL, NULL, NULL, NULL ); NtDeviceIoControlFile( deviceHandle, NULL, NULL, NULL, &isb, FSCTL_UNLOCK_VOLUME, NULL, NULL, NULL, NULL ); //CloseHandle(DeviceHandle); NtClose(deviceHandle); DefineDosDeviceW(DDD_REMOVE_DEFINITION, mountPoint, NULL); }