\Device\HarddiskVolumeX

Тема в разделе "WASM.WIN32", создана пользователем RamMerLabs, 22 фев 2007.

  1. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Как преобразовать \Device\HarddiskVolume1 в c:\ в MASM? Ну и соответственно для других разделов.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    http://www.wasm.ru/forum/viewtopic.php?id=13999
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Упс... Извиняюсь.
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    а по-нормальному как-нибудь нельзя?

    кто-нить знает, как RtlNtPathNameToDosPathName() пользоваться?
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    http://www.tutorials-blog.com/nt/Device-Name/
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    да видел я этот блог, а толку то?
    IoVolumeDeviceToDosName - это kernel
    а если из win32? про RtlNtPathNameToDosPathName там ничего осмысленного не сказано
    я даже больше скажу, я эту функцию пытался дизасмить, только надоело оч быстро
    первый параметр, вроде, должен быть NULL, два следующих - похоже, сами стринги, не поймешь ANSI_STRING или UNICODE.. какая входная, какая выходная, тоже непонятно. Кажется, входная первая
    последний параметр вообще непоняно для чего
    сколько не вызывал ее, получал один только какой-то бред
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Код (Text):
    1. c: -----+
    2.         |
    3.         v
    4. m: -->  \Device\HarddiskVolume1
    5.         ^
    6.         |
    7. z: -----+
    c: ссылка на \Device\HarddiskVolume1. Можно создать ещё ссылок, например, m: и z:. Девайс \Device\HarddiskVolume1 не знает, кто на него ссылается. Т.о. обратной функции нет - только перебор.
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    самые очевидные вещи приходят в голову самыми последними ))
    а что же тогда такое RtlNtPathNameToDosPathName()
    да, кстати, и IoVolumeDeviceToDosName?
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    мда.. разбираться в оптимизированном коде RtlNtPathNameToDosPathName я не стал, но похоже, все, что эта функция умеет делать - это убирать префиксы вида "\\??\\" и "\\??\\UNC\\"
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    можно взять первый
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    или второй... так как это ссылка, то это поидее одно и тоже?
     
  12. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Действительно, получается только перебором. Всем спасибо!
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    от нефиг делать набросал:
    Код (Text):
    1. BOOL ConvertInternalNtPathToNtPath(IN LPCTSTR lpNtInternalPath, OUT LPTSTR lpNtPath, IN SIZE_T nNtPathLengthInBytes)
    2. {
    3.     BOOL fReturned= FALSE;
    4.     HANDLE hVolume= INVALID_HANDLE_VALUE;
    5.     TCHAR tszBuffer[2*MAX_PATH];
    6.     TCHAR tszBuffer1[2*MAX_PATH];
    7.     LPTSTR lpVolumeName;
    8.     DWORD dwLastError;
    9.     size_t nLen, nLen1, nLen2;
    10.  
    11.     __try
    12.     {
    13.         if(lpNtInternalPath==NULL)
    14.         {
    15.             SetLastError(ERROR_BAD_ARGUMENTS);
    16.             __leave;
    17.         }
    18.  
    19.         hVolume= FindFirstVolume(tszBuffer, sizeof(tszBuffer)/sizeof(tszBuffer[0])-1);
    20.  
    21.         if(hVolume==NULL || hVolume==INVALID_HANDLE_VALUE)
    22.             __leave;
    23.  
    24.         do
    25.         {
    26.             tszBuffer[sizeof(tszBuffer)/sizeof(tszBuffer[0])-1]= _T('\0');
    27.  
    28.             if(!_tcsncmp(tszBuffer, _T("\\\\?\\UNC\\"), sizeof(_T("\\\\?\\UNC\\"))/sizeof(TCHAR)-1))
    29.             {
    30.                 lpVolumeName= tszBuffer+sizeof(_T("\\\\?\\UNC\\"))/sizeof(TCHAR)-1;
    31.                 nLen2= sizeof(_T("\\\\?\\UNC\\"))/sizeof(TCHAR)-1;
    32.             }
    33.             else if(!_tcsncmp(tszBuffer, _T("\\\\?\\"), sizeof(_T("\\\\?\\"))/sizeof(TCHAR)-1))
    34.             {
    35.                 lpVolumeName= tszBuffer+sizeof(_T("\\\\?\\"))/sizeof(TCHAR)-1;
    36.                 nLen2= sizeof(_T("\\\\?\\"))/sizeof(TCHAR)-1;
    37.             }
    38.             else
    39.             {
    40.                 lpVolumeName= tszBuffer;
    41.                 nLen2= 0;
    42.             }
    43.  
    44.             nLen= _tcslen(lpVolumeName);
    45.  
    46.             if(!nLen)
    47.                 continue;
    48.  
    49.             if(lpVolumeName[nLen-1]==_T('\\'))
    50.                 lpVolumeName[--nLen]= _T('\0');
    51.  
    52.             nLen1= QueryDosDevice(lpVolumeName, tszBuffer1, sizeof(tszBuffer1)/sizeof(tszBuffer1[0]));
    53.             if(!nLen1 || nLen1>=sizeof(tszBuffer1)/sizeof(tszBuffer1[0])-1)
    54.                 continue;
    55.  
    56.             nLen1= _tcslen(tszBuffer1);
    57.             if(!nLen1)
    58.                 continue;
    59.  
    60.             if(!_tcsncmp(lpNtInternalPath, tszBuffer1, nLen1))
    61.             {
    62.                 if(lpNtPath==NULL)
    63.                 {
    64.                     SetLastError(ERROR_INVALID_USER_BUFFER);
    65.                     __leave;
    66.                 }
    67.  
    68.                 nLen+= nLen2;
    69.  
    70.                 nLen2= _tcslen(lpNtInternalPath);
    71.                 if(nLen2<nLen1)
    72.                 {
    73.                     SetLastError(ERROR_INVALID_DATA);
    74.                     __leave;
    75.                 }
    76.                
    77.                 nLen2-= nLen1;
    78.                 nNtPathLengthInBytes/= sizeof(TCHAR);
    79.  
    80.                 if(nNtPathLengthInBytes<nLen+nLen2+1)
    81.                 {
    82.                     SetLastError(ERROR_INSUFFICIENT_BUFFER);
    83.                     __leave;
    84.                 }
    85.  
    86.                 _tcscpy(lpNtPath, tszBuffer);
    87.                 _tcsncpy(lpNtPath+nLen, lpNtInternalPath+nLen1, nLen2);
    88.                 lpNtPath[nLen+nLen2]= _T('\0');
    89.                
    90.                 fReturned= TRUE;
    91.                 SetLastError(ERROR_SUCCESS);
    92.                 __leave;
    93.             }
    94.         }
    95.         while(FindNextVolume(hVolume, tszBuffer, sizeof(tszBuffer)/sizeof(tszBuffer[0])));
    96.  
    97.         if(GetLastError()==ERROR_NO_MORE_FILES)
    98.             SetLastError(ERROR_PATH_NOT_FOUND);
    99.     }
    100.     __finally
    101.     {
    102.         if(hVolume!=NULL && hVolume!=INVALID_HANDLE_VALUE)
    103.         {
    104.             dwLastError= GetLastError();
    105.             FindVolumeClose(hVolume);
    106.             SetLastError(dwLastError);
    107.         }
    108.     }
    109.  
    110.     return fReturned;
    111. }
     
  14. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Переписал всё это дело на Паскаль - мож кому пригодится:

    Код (Text):
    1. function ConvertUNCtoDOS(UNCPath: PChar; out DOSPath: String): Boolean;
    2. const
    3.   sHead1 = '\\?\UNC\';
    4.   sHead2 = '\\?\';
    5. var
    6.   hVolume: THandle;
    7.   VolumeName: array [0..MAX_PATH] of Char;
    8.   DeviceName: array [0..MAX_PATH] of Char;
    9.   DriveLetter: array [0..12] of Char;
    10.   VolumeName2: PChar;
    11.   PathExe: PChar;
    12.   Bytes: DWORD;
    13.   lhead, lvn, lvn2, ldn, ldl: Integer;
    14. begin
    15.     Result := False;
    16.     DOSPath := '';
    17.     if (UNCPath = nil) then begin
    18.       SetLastError(ERROR_BAD_ARGUMENTS);
    19.       Exit;
    20.     end;
    21.     hVolume := FindFirstVolumeA(@VolumeName, SizeOf(VolumeName));
    22.     if (hVolume = 0) or (hVolume = INVALID_HANDLE_VALUE) then Exit;
    23.     repeat
    24.       VolumeName[SizeOf(VolumeName)-1] := #0;
    25.       lvn := lstrlen(@VolumeName);
    26.       if (lvn = 0) then Continue;
    27.  
    28.       if AnsiStrPos(@VolumeName, sHead1) = @VolumeName then begin
    29.         VolumeName2 := Pointer(Cardinal(@VolumeName) + SizeOf(sHead1));
    30.       end else
    31.       if AnsiStrPos(@VolumeName, sHead2) = @VolumeName then begin
    32.         VolumeName2 := Pointer(Cardinal(@VolumeName) + SizeOf(sHead2));
    33.       end else begin
    34.         VolumeName2 := @VolumeName;
    35.       end;
    36.  
    37.       lvn2 := lstrlen(VolumeName2);
    38.       if (lvn2 = 0) then Continue;
    39.       if VolumeName2[lvn2-1] = '\' then begin
    40.         Dec(lvn2);
    41.         VolumeName2[lvn2] := #0;
    42.       end;
    43.  
    44.       ldn := QueryDosDevice(VolumeName2, @DeviceName, SizeOf(DeviceName));
    45.       if (ldn = 0) or (ldn >= SizeOf(DeviceName)-1) then Continue;
    46.       ldn := lstrlen(@DeviceName);
    47.       if (ldn = 0) then Continue;
    48.  
    49.       if AnsiStrPos(UNCPath, @DeviceName) = UNCPath then begin
    50.         if VolumeName2[lvn2-1] <> '\' then begin
    51.           VolumeName2[lvn2] := '\';
    52.           VolumeName2[lvn2+1] := #0;
    53.         end;
    54.         if GetVolumePathNamesForVolumeNameA(@VolumeName, @DriveLetter, SizeOf(DriveLetter), Bytes) then begin
    55.           ldl := lstrlen(@DriveLetter);
    56.           if (ldl < 2) then Break;
    57.           DOSPath := DriveLetter[0] + DriveLetter[1];
    58.           PathExe := Pointer(Cardinal(UNCPath) + ldn);
    59.           DOSPath := DOSPath + PathExe;
    60.           Result := True;
    61.           Break;
    62.         end else begin
    63.           Break;
    64.         end;
    65.       end;
    66.     until not FindNextVolumeA(hVolume, @VolumeName, SizeOf(VolumeName));
    67.     FindVolumeClose(hVolume);
    68. end;