На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Не работают FindFirstVolumeMountPoint / FindNextVolumeMountPoint
    Пишу:
    ExpandedWrap disabled
      {$APPTYPE CONSOLE}
      uses Windows;
       
      function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeA';
      function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeA';
      function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external kernel32;
       
      function FindFirstVolumeMountPoint(lpszRootPathName, lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeMountPointA';
      function FindNextVolumeMountPoint(hFindVolumeMountPoint: THandle; lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeMountPointA';
      function FindVolumeMountPointClose(hFindVolumeMountPoint: THandle): BOOL; stdcall; external kernel32;
       
      var
        Vol, Point: array [0..1023] of AnsiChar;
        VH, PH: THandle;
       
      begin
        VH := FindFirstVolume(Vol, SizeOf(Vol));
        if VH = INVALID_HANDLE_VALUE then
        begin
          WriteLn('No volumes found!');
          Exit;
        end;
       
        repeat
          WriteLn(Vol);
          PH := FindFirstVolumeMountPoint(Vol, Point, SizeOf(Point));
          if PH = INVALID_HANDLE_VALUE then
            WriteLn('  No mounted folders.')
          else
          begin
            repeat
              WriteLn('  ', Point);
            until not FindNextVolumeMountPoint(PH, Point, SizeOf(Point));
            FindVolumeMountPointClose(PH);
          end;
          WriteLn;
        until not FindNextVolume(VH, Vol, SizeOf(Vol));
       
        FindVolumeClose(VH);
        ReadLn;
      end.

    Выдаёт GUID томов, но точек подключения нет. Почему? Что не так?
    А вот функция GetVolumePathNamesForVolumeName работает...

    Добавлено
    p.s. Это пускается из-под D7. Если убрать объявления функций и компилить через Tokyo (PWideChar), результат тот же.
      Jin X
      Если просто, то эта функция делает не то о чём вы подумали.
      Это особые папки которые есть только в NFTS.
      Что-бы увидеть их с начало создать надо.

      ExpandedWrap disabled
        {$APPTYPE CONSOLE}
        uses Windows;
         
        function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeA';
        function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeA';
        function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external kernel32;
         
        function FindFirstVolumeMountPoint(lpszRootPathName, lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeMountPointA';
        function FindNextVolumeMountPoint(hFindVolumeMountPoint: THandle; lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeMountPointA';
        function FindVolumeMountPointClose(hFindVolumeMountPoint: THandle): BOOL; stdcall; external kernel32;
         
         
        function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPSTR; lpszVolumeName: LPSTR; cchBufferLength: DWORD): Bool; stdcall; external kernel32 name 'GetVolumeNameForVolumeMountPointA';
        function SetVolumeMountPoint(lpszVolumeMountPoint: LPSTR; lpszVolumeName: LPSTR): Bool; stdcall; external kernel32 name 'SetVolumeMountPointA';
        function DeleteVolumeMountPoint(lpszVolumeMountPoint: LPSTR): Bool; stdcall; external kernel32 name 'DeleteVolumeMountPointA';
         
        var
          Vol, Point: array [0..1023] of AnsiChar;
          VH, PH: THandle;
          Ck:Bool;
        begin
         // Что мантируем
          Ck:=GetVolumeNameForVolumeMountPoint('H:\', Vol, SizeOf(Vol));
          if not Ck then
          begin
            WriteLn('No volumes found!');
            Exit;
          end;
         
        // Куда мантируем
          Ck:=SetVolumeMountPoint('F:\DiskH\', Vol);
          if not Ck then
          begin
            WriteLn('Cannot mount!');
          end;
         
          VH := FindFirstVolume(Vol, SizeOf(Vol));
          if VH = INVALID_HANDLE_VALUE then
          begin
            WriteLn('No volumes found!');
            Exit;
          end;
         
          repeat
            WriteLn(Vol);
            PH := FindFirstVolumeMountPoint(Vol, Point, SizeOf(Point));
            if PH = INVALID_HANDLE_VALUE then
              WriteLn('  No mounted folders.')
            else
            begin
              repeat
                WriteLn('  ', Point);
              until not FindNextVolumeMountPoint(PH, Point, SizeOf(Point));
              FindVolumeMountPointClose(PH);
            end;
            WriteLn;
          until not FindNextVolume(VH, Vol, SizeOf(Vol));
         
          FindVolumeClose(VH);
          ck:=DeleteVolumeMountPoint('F:\DiskH\');
          if not Ck then
          begin
            WriteLn('Cannot unmount!');
            Exit;
          end;
          ReadLn;
        end.
        Если речь о папках, смотнированных на том, то я специально монтировал папки, их всё равно не видно через эту функцию :(

        Добавлено
        Да, я нашёл "They do not return drive letters or volume GUID paths".
        И я разобрался почему не видно было папки.
        Оказывается, эти Find'ы работают только от имени администратора, от юзера ничего не показывают.
        А вот GetVolumePathNamesForVolumeName работают и от юзера (и диски тоже показывают), и от админа. Бред какой-то...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0223 ]   [ 17 queries used ]   [ Generated: 28.03.24, 23:32 GMT ]