Esempio n. 1
0
	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;
		}
	}
Esempio n. 2
0
	~filePathLinkW()
	{
		if (m_transformed)
		{
			DWORD err = GetLastError();
			DefineDosDeviceW(DDD_REMOVE_DEFINITION, m_pathDefine.c_str(), m_ntType.c_str());
			SetLastError(err);
		}
	}
Esempio n. 3
0
/*
 * @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;
}
Esempio n. 4
0
File: mode.c Progetto: GYGit/reactos
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;
}
Esempio n. 6
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
        );
}
Esempio n. 7
0
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);
}