Здравствуйте! Код такой: Код (Text): #ifndef SYMBOLIC_LINK_ALL_ACCESS #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) #endif ::std::wstring getSymbolicLinkDeviceName(const ::std::wstring &_deviceName) { HMODULE hNtDll = ::GetModuleHandleW( L"Ntdll.dll" ); if (!hNtDll) return ::std::wstring(); NtOpenSymbolicLinkObjectFnPtr pNtOpenSymbolicLinkObject = (NtOpenSymbolicLinkObjectFnPtr)GetProcAddress( hNtDll, "NtOpenSymbolicLinkObject" ); if (!pNtOpenSymbolicLinkObject) return ::std::wstring(); NtCloseFnPtr pNtClose = (NtCloseFnPtr)GetProcAddress( hNtDll, "NtClose" ); if (!pNtClose) return ::std::wstring(); NtQuerySymbolicLinkObjectFnPtr pNtQuerySymbolicLinkObject = (NtQuerySymbolicLinkObjectFnPtr)GetProcAddress( hNtDll, "NtQuerySymbolicLinkObject" ); if (!pNtQuerySymbolicLinkObject) return ::std::wstring(); //::std::wstring deviceName = ::std::wstring(L"\\??\\") + getSerialDeviceNameOnly(_deviceName); // \??\COM1 - 0xc0000033 - Object Name invalid //::std::wstring deviceName = ::std::wstring(L"\\\\?\\") + getSerialDeviceNameOnly(_deviceName); // \\.\COM1 - 0xc0000033 //::std::wstring deviceName = getSerialDeviceNameOnly(_deviceName); // COM1 - 0xc000003b - Object Path Component was not a directory object. ::std::wstring deviceName = _deviceName; // \\.\COM1 COM1 - 0xc0000033 WCHAR linkNameBuf[1024]; size_t linkNameBufSize = sizeof(linkNameBuf)/sizeof(linkNameBuf[0]); size_t deviceNameSize = deviceName.size(); if (deviceNameSize>(linkNameBufSize-1)) deviceNameSize = linkNameBufSize-1; deviceName.copy( linkNameBuf, deviceNameSize, 0); linkNameBuf[deviceNameSize] = 0; UNICODE_STRING linkName = { (USHORT)deviceNameSize, (USHORT)linkNameBufSize, linkNameBuf }; OBJECT_ATTRIBUTES ObjectAttributes; InitializeObjectAttributes( &ObjectAttributes, &linkName, 0, 0, 0 ); HANDLE hLinkHandle = INVALID_HANDLE_VALUE; NTSTATUS Status = pNtOpenSymbolicLinkObject( &hLinkHandle , SYMBOLIC_LINK_ALL_ACCESS , &ObjectAttributes ); if (!NT_SUCCESS( Status )) // выдаваемые ошибки см. выше return ::std::wstring(); WCHAR linkNameTargetBuf[1024]; UNICODE_STRING linkTarget = { (USHORT)(sizeof(linkNameTargetBuf)/sizeof(linkNameTargetBuf[0])), 0, linkNameTargetBuf }; Status = pNtQuerySymbolicLinkObject( hLinkHandle , &linkTarget , 0 ); pNtClose( hLinkHandle ); if (!NT_SUCCESS( Status )) return ::std::wstring(); return ::std::wstring( linkNameTargetBuf, linkTarget.Length ); } Как для COM порта получить имя устройства?
Для дисков: (HANDLE) hDevice, // handle to device IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize (LPVOID) lpOutBuffer, // output buffer (DWORD) nOutBufferSize, // size of output buffer (LPDWORD) lpBytesReturned, // number of bytes returned (LPOVERLAPPED) lpOverlapped // OVERLAPPED structure ); для COM портов \\Device\\Serial0 + ф-ция RtlDosPathNameToNtPathName_U \\\\.\\COM1 - это для WIN32 подсистемы.
А нельзя ли чуть поподробнее? Мне надо имя ком порта (COMX, \\.\COMX) преобразовать в имя устройства \\Device\\SerialX. Вычитал, что '\??\COMX' это симлинк на \\Device\\SerialX и это должно как раз разрешаться функциями NtOpenSymbolicLinkObject/NtQuerySymbolicLinkObject. Но у меня почему-то не заработало, ну и я решил по разному еще попробовать, но ни один способ не заработал. Насчет RtlDosPathNameToNtPathName не совсем понятно, она сразу преобразует COMX -> \\Device\\SerialX, или ее результат надо передать в Nt*SymbolicLinkObject?
Код (Text): OBJECT_ATTRIBUTES Oa; UNICODE_STRING Ua; NTSTATUS Status; HANDLE LinkHandle; RtlInitUnicodeString (&Ua, L"\\??\\COM3"); InitializeObjectAttributes (&Oa, &Ua, 0, 0, 0); Status = ZwOpenSymbolicLinkObject ( &LinkHandle, STANDARD_RIGHTS_REQUIRED | 1, &Oa ); WCHAR buffer[1024] = L""; UNICODE_STRING Target = {0, sizeof(buffer)/sizeof(*buffer), buffer}; Status = ZwQuerySymbolicLinkObject (LinkHandle, &Target, NULL); printf("%S\n", buffer); ZwClose (LinkHandle); шикарно пашет. ищи багу у себя, должно все работать.
Нашел косяк. Даная функция инициализирует UNICODE_STRING таким образом, что все размеры измеряются в байтах, а я ручками инициализировал, наивно полагая, что размеры задаются в символах.