Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


NikLok
ну вроде что-то получилось - для обычного каталога UDF воспроизводит переданный в параметре путь к каталогу и устанавливает @extended=0, если каталог является только ссылкой, то восстанавливается его реальный путь и значение @extended=1 :
Код: Выделить весь код
#include <Constants.au3>

Func _DirGetJunctionTarget($sDirPath)
    If StringInStr(FileGetAttrib($sDirPath),"D") =0 Then Return SetError(1, 0, "")  ; Ошибка: параметр не является каталогом
    Local $tRet = DllStructCreate("dword"), $aRet
    Local $tBuf = DllStructCreate("byte["& 1024 *16 &"]")
    Local $REPARSE_MOUNTPOINT_DATA_BUFFER = _
        DllStructCreate("int ReparseTag;dword ReparseDataLength;ushort;ushort ReparseTargetLength;ushort ReparseTargetMaximumLength;ushort;wchar ReparseTarget[260]", _
        DllStructGetPtr($tBuf))
    Local $aFile = DllCall("kernel32.dll", "int", "CreateFile", _
        "str", $sDirPath, "dword", 0, "dword", 0, "ptr", 0, "dword", $OPEN_EXISTING, "dword", 0x2200000, "ptr", 0 )
    If Not(IsArray($aFile)) Then Return SetError(2, 1, "") ; Ошибка вызова DLL
    If $aFile[0]=-1 Then
        $aRet = DllCall("kernel32.dll", "int", "GetLastError")
        Return SetError(3, $aRet[0], "") ; Ошибка доступа к каталогу
    EndIf
    $aRet = DllCall("kernel32.dll", "int", "DeviceIoControl", _
        "hwnd", $aFile[0], "dword", 0x900A8, "ptr", 0, "dword", 0, "ptr", DllStructGetPtr($tBuf), "dword", DllStructGetSize($tBuf), "ptr", DllStructGetPtr($tRet), "ptr", 0)
    DllCall("kernel32.dll", "int", "CloseHandle", "int", $aFile[0])
    If Not(IsArray($aRet)) Then Return SetError(2, 2, "") ; Ошибка вызова DLL
    If $aRet[0]=0 Then
        $aRet = DllCall("kernel32.dll", "int", "GetLastError")
        If $aRet[0] = 0x1126 Then Return SetError(0, 0, $sDirPath)
        Return SetError(4, $aRet[0], "") ; Другие ошибки ввода/вывода
    EndIf
    $sDirPath = StringRegExpReplace(DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER,"ReparseTarget"),"^\\\?\?\\","")
    Return SetError(0, DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER, "ReparseTag")=0xA0000003, $sDirPath)
EndFunc

Последний раз редактировалось amel27, 29-04-2008 в 06:46. Причина: очепятка в имени ф-ции

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:57, 28-04-2008 | #462