Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Laufwerk GUID Laufwerksbuchstabe auslesen / unmount (https://www.delphipraxis.net/137146-laufwerk-guid-laufwerksbuchstabe-auslesen-unmount.html)

berens 15. Jul 2009 03:28


Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
Hi!

Mal wieder nervlich am Ende, wie man anhand der aktuellen Uhrzeit vielleicht erahnen kann.

Ich will einfach nur Anhand einer GUID meine USB-Festplatte unmounten.
Der Mountvol Befehl von Windows kann nur einen bestimmten Laufwerksbuchstaben unmounten (z.B. F: ), nicht aber die GUID (z.B. \\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\ )

Bezugnehmend auf http://www.delphipraxis.net/internal...ht=volume+guid
Delphi-Quellcode:
Function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: PAnsiChar; lpszVolumeName: PAnsiChar; cchBufferLength: DWORD;): Bolean; stdcall; external 'kernel32.dll' name 'GetVolumeNameForVolumeMountPoint';
);
soll ich damit zwar aaaaangeblich die Info bekommen, tatsächlich bekomm ich aber als Ausgabe wieder nur die GUID zurück...


Noch glücklicher wäre ich, wenn mir wer sagen kann, wie ich ein Laufwerk direkt anhand seiner GUID unmounten kann. Vielen Dank.

himitsu 15. Jul 2009 07:19

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
der VolumeName ist die GUID, also kein Wunder, daß da sowas bei rauskommt :zwinker:

du brauchst also die Umkehrfunktion.

berens 15. Jul 2009 11:09

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
Wie könnte die "Umkehrfunktion" lauten? GetVolumeMountPointForVolumeName gibt es nicht.

Wenn Windows alles mit der GUID machen will, warum kann man dann nicht mit der GUID einen Laufwerksbuchstaben zurücknehmen (weil ich ja nicht weiß, wie die lautet, ob F: oder G: etc.)?

himitsu 15. Jul 2009 11:17

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
ich weiß jetzt allerdings auch nicht, wie sich diese Funktion nennen könnte,

aber im Notfall könntest du dir alle VolumeMointPoints auflisten,
jeweils den VolumeName über GetVolumeNameForVolumeMountPoint erhalten
und diesen dann mit dem Gesuchten vergleichen.


[add]
nja, mal ganz im Ernst ... über MSDN-Library durchsuchenGetVolumeNameForVolumeMountPoint findet man Funktionen wie z.B. MSDN-Library durchsuchenFindFirstVolumeMountPoint, welche vermutlich genau das Gewünschte liefern würden.

berens 15. Jul 2009 11:56

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
Also damit klappt es, ich will das Ganze noch als Kommandozeilen Parameter erweitern, das ist ja aber kein Problem.

Meine Frage: Stimmt das mit den Variablen x und a? Ich glaube nicht ganz, aber atm funktioniert es :/

Delphi-Quellcode:
function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;

Delphi-Quellcode:
program unmount;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows,
  ShellAPI,
  ShellObjExtended in 'ShellObjExtended.pas';

var
  t: string;
  x: array[0..MAX_PATH] of char;
  a: Cardinal;


begin
  try
    if ParamCount < 1 then begin
      writeln('Unmounts a MountPoint by its VolumeName (GUID)');
      writeln('USAGE: unmount GUID');
      writeln('EXAMPLE: unmount \\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\');
      writeln(' ');
      writeln('You can determine your drive''s GUID by the command MOUNTVOL');
      exit;
    end;
    a := MAX_PATH;
    GetVolumePathNamesForVolumeName(pchar(ParamStr(1)), @x, MAX_PATH, a);
    ShellExecute(0, 'open', 'mountvol', pchar(x + ' /D'), '', SW_HIDE);
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Delphi-Quellcode:
unit ShellObjExtended;

interface

uses
  Windows, Messages, ShlObj;

const
  IID_IColumnProvider: TGUID = (
    D1: $E8025004; D2: $1C42; D3: $11D2; D4: ($BE, $2C, $0, $A0, $C9, $A8, $3D, $A1));

  SID_IColumnProvider = '{E8025004-1C42-11D2-BE2C-00A0C9A83DA1}';

  FILE_FLAG_OPEN_REPARSE_POINT = $00200000;
                                 
const
  MAX_COLUMN_NAME_LEN = 80;
  MAX_COLUMN_DESC_LEN = 128;

type
  HANDLE = Windows.THandle;

  SHCOLUMNINFO = packed record
    scid: SHCOLUMNID;
    vt: integer;
    fmt: DWORD;
    cChars: UINT;
    csFlags: dword;
    wszTitle: array[0..MAX_COLUMN_NAME_LEN - 1] of WideChar;
    wszDescription: array[0..MAX_COLUMN_DESC_LEN - 1] of WideChar;
  end;
  LPSHCOLUMNINFO = ^SHCOLUMNINFO;

  TShColumnInfo = SHCOLUMNINFO;
  PShColumnInfo = LPSHCOLUMNINFO;

  SHCOLUMNINIT = packed record
    dwFlags: ulong;
    dwReserved: ulong;
    wszFolder: array[0..MAX_PATH - 1] of WideChar;
  end;
  LPSHCOLUMNINIT = ^SHCOLUMNINIT;

  TShColumnInit = SHCOLUMNINIT;
  PShColumnInit = LPSHCOLUMNINIT;

const
  SHCDF_UPDATEITEM = $00000001;

type
  SHCOLUMNDATA = packed record
    dwFlags: ULONG;
    dwFileAttributes: DWord;
    dwReserved: ULONG;
    pwszExt: PWideChar;
    wszFile: array[0..MAX_PATH - 1] of WideChar
  end;
  LPSHCOLUMNDATA = ^SHCOLUMNDATA;

  TShColumnData = SHCOLUMNDATA;
  PShColumnData = LPSHCOLUMNDATA;

  IColumnProvider = interface
    [SID_IColumnProvider]
    function Initialize(psci: PSHCOLUMNINIT): HResult; stdcall;
    function GetColumnInfo(dwIndex: DWORD; psci: PSHCOLUMNINFO): HResult; stdcall;
    function GetItemData(pscid: PSHCOLUMNID; pscd: PSHCOLUMNDATA; pvarData: Variant): HResult; stdcall;
  end;

// From Winbase.h
function GetVolumePathNameA(lpszFileName: LPCSTR; lpszVolumePathName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNameA}
function GetVolumePathNameW(lpszFileName: LPCWSTR; lpszVolumePathName: LPWSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNameW}
function GetVolumePathName(lpszFileName: LPCSTR; lpszVolumePathName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathName}

function GetVolumePathNamesForVolumeNameA(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeNameA}
function GetVolumePathNamesForVolumeNameW(lpszVolumeName, lpszVolumePathNames: LPCWSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeNameW}
function GetVolumePathNamesForVolumeName(lpszVolumeName, lpszVolumePathNames: LPCSTR;
  cchBufferLength: DWORD; var lpcchReturnLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumePathNamesForVolumeName}

function GetVolumeNameForVolumeMountPointA(lpszVolumeMountPoint: LPCSTR;
  lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPointA}
function GetVolumeNameForVolumeMountPointW(lpszVolumeMountPoint: LPCWSTR;
  lpszVolumeName: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPointW}
function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPCSTR;
  lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM GetVolumeNameForVolumeMountPoint}

function FindFirstVolumeA(lpszVolumeName: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeA}
function FindFirstVolumeW(lpszVolumeName: LPWSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeW}
function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolume}

function FindNextVolumeA(hFindVolume: HANDLE; lpszVolumeName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeA}
function FindNextVolumeW(hFindVolume: HANDLE; lpszVolumeName: LPWSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeW}
function FindNextVolume(hFindVolume: HANDLE; lpszVolumeName: LPSTR;
  cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolume}

function FindVolumeClose(hFindVolume: HANDLE): BOOL; stdcall;
{$EXTERNALSYM FindVolumeClose}

function FindFirstVolumeMountPointA(lpszRootPathName: LPCSTR;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPointA}
function FindFirstVolumeMountPointW(lpszRootPathName: LPCWSTR;
  lpszVolumeMountPoint: LPWSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPointW}
function FindFirstVolumeMountPoint(lpszRootPathName: LPCSTR;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): HANDLE; stdcall;
{$EXTERNALSYM FindFirstVolumeMountPoint}

function FindNextVolumeMountPointA(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPointA}
function FindNextVolumeMountPointW(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPointW}
function FindNextVolumeMountPoint(hFindVolumeMountPoint: HANDLE;
  lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
{$EXTERNALSYM FindNextVolumeMountPoint}

function FindVolumeMountPointClose(hFindVolumeMountPoint: HANDLE): BOOL; stdcall;
{$EXTERNALSYM FindVolumeMountPointClose}

implementation

function GetVolumePathNameA; external kernel32 name 'GetVolumePathNameA';
function GetVolumePathNameW; external kernel32 name 'GetVolumePathNameW';
function GetVolumePathName; external kernel32 name 'GetVolumePathNameA';

function GetVolumePathNamesForVolumeNameA; external kernel32 name 'GetVolumePathNamesForVolumeNameA';
function GetVolumePathNamesForVolumeNameW; external kernel32 name 'GetVolumePathNamesForVolumeNameW';
function GetVolumePathNamesForVolumeName; external kernel32 name 'GetVolumePathNamesForVolumeNameA';

function GetVolumeNameForVolumeMountPointA; external kernel32 name 'GetVolumeNameForVolumeMountPointA';
function GetVolumeNameForVolumeMountPointW; external kernel32 name 'GetVolumeNameForVolumeMountPointW';
function GetVolumeNameForVolumeMountPoint; external kernel32 name 'GetVolumeNameForVolumeMountPointA';

function FindFirstVolumeA; external kernel32 name 'FindFirstVolumeA';
function FindFirstVolumeW; external kernel32 name 'FindFirstVolumeW';
function FindFirstVolume; external kernel32 name 'FindFirstVolumeA';

function FindNextVolumeA; external kernel32 name 'FindNextVolumeA';
function FindNextVolumeW; external kernel32 name 'FindNextVolumeW';
function FindNextVolume; external kernel32 name 'FindNextVolumeA';

function FindVolumeClose; external kernel32 name 'FindVolumeClose';

function FindFirstVolumeMountPointA; external kernel32 name 'FindFirstVolumeMountPointA';
function FindFirstVolumeMountPointW; external kernel32 name 'FindFirstVolumeMountPointW';
function FindFirstVolumeMountPoint; external kernel32 name 'FindFirstVolumeMountPointA';

function FindNextVolumeMountPointA; external kernel32 name 'FindNextVolumeMountPointA';
function FindNextVolumeMountPointW; external kernel32 name 'FindNextVolumeMountPointW';
function FindNextVolumeMountPoint; external kernel32 name 'FindNextVolumeMountPointA';

function FindVolumeMountPointClose; external kernel32 name 'FindVolumeMountPointClose';

end.

himitsu 15. Jul 2009 14:35

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
und das läuft wirklich?

Delphi-Quellcode:
t := '\\?\Volume{faf095ab-31d3-11de-92c2-001d09d96fe8}\';
GetVolumePathNamesForVolumeName(pchar(t), @x, MAX_PATH, a);
Writeln(x);
Writeln(a);
hätte mindestens erwartet, daß bei deiner Funktionsdefinition wegen des fehlenden @ gemeckert würde
(PChar <> Array of Char)

und das mit dem a wäre zwar nicht falsch, aber so ist es vermutlich verständlicher

berens 15. Jul 2009 14:39

Re: Laufwerk GUID Laufwerksbuchstabe auslesen / unmount
 
Habe es angepasst. Läuft mit beiden Varianten, natürlich benutze ich deine, da diese eher korrekt ist als meine ;)

Woher kann ich denn erkennen, dass/ob die Funktion als Parameter eine Variable verlangt, oder ob eine Konstante (MAX_PATH) ausreicht?

Auf jeden Fall funktioniert das Programm soweit sehr gut, Danke himitsu :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz