Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Windows - Festspeicher-Schnittstelle ermitteln (https://www.delphipraxis.net/195691-windows-festspeicher-schnittstelle-ermitteln.html)

KodeZwerg 18. Mär 2018 20:55

Betriebssystem: Win XP,Win Vista,Win 7,Win 8,Win 8.1,Win 10

Windows - Festspeicher-Schnittstelle ermitteln
 
Ich wusste nicht in welche Kategorie ich diese Frage stellen soll, bitte verschieben falls es hier unangebracht ist.

Ich entwickle eine kleine App die mir folgendes auflisten soll, Cluster/Köpfe/Seriennummer usw (für mechanische HDD) bzw das Pendant dazu für SSD.
Ich habe mir WMI dafür "ausgeborgt" um an diese Daten zu gelangen, klappt auch alles soweit ganz prächtig.
Nun bin ich dabei herauszufinden wie denn die HDD/SSD/USB-Stick/USB-Platte überhaupt mit dem System verbunden ist,
ich kann momentan nur zwischen "Intern verbaut" oder "USB" unterscheiden,
aber ich würde gerne die Schnittstelle (Beispiel ATA/133, S-ATA, S-ATAe/m.2, RAID-Verbund usw) erfahren.
Hat dazu jemand eine Idee wie ich das mit Delphi bewerkstelligen könnte?

Delphi.Narium 18. Mär 2018 23:59

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Schau mal bitte hier, ob was brauchbares dabei ist: Bei Google suchenWmi Delphi Code Creator

KodeZwerg 19. Mär 2018 01:10

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Olala, das hätte ich mal schon vor einer Woche Wissen müssen.
Ich Tüftel und Recherchiere mir alles einzeln zurecht, war irgendwie auch stolz das ich das mit WMI soweit ich konnte in Eigenregie hinbekam, aber das ..... Mann-O-Mann, haut mich vom Hocker.
Dein Tipp mit dem Creator ist Gold wert!
Ich kann zwar noch nicht beurteilen ob das was ich Suche dabei ist, dafür ist es zu Umfangreich, aber ich habe ein sehr gutes Gefühl dabei.
Dank voriger selbstständiger rumbastelei mit WMI fällt es mir zumindest leichter das alles zu verstehen und zu interpretieren.
Ich vertiefe mich mal in den Creator, Vielen vielen vielen, sagte ich schon vielen?, Dank!
Du bist mein Held des Tages bzw der Nacht, apropo, Gute Nacht ;D

PS: Falls jemand eventuell etwas ohne WMI zu benutzen für klüger empfindet um an solche Informationen zu gelangen, bitte hier melden. (gemeint sind umfangreiche Laufwerks-Informationen)

Delphi.Narium 19. Mär 2018 10:31

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Literatur dazu (um dann mit den Infos konkret weiterzusuchen): S.M.A.R.T. (Self-Monitoring, Analysis and Reporting Technology)

Und wenn's nicht so aufwändig sein soll, dann hier im Forum mal nach Smart suchen:

https://www.delphipraxis.net/dp_sear...ch_matchmode=0

und da dann das Relevante raussuchen:

https://www.delphipraxis.net/72013-s...rte-lesen.html
https://www.delphipraxis.net/69743-u...erk-smart.html

Frei nach dem Motto: Der Tag ist gerettet, da kommt nun keine Langeweile mehr auf ;-)

KodeZwerg 19. Mär 2018 12:11

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Der "Stoff" ist gut, Delphi ist ja eh eine Droge und Du Unterstützt meine Sucht ^-^
Damit bin ich erstmal längere Zeit beschäftigt und werde wahrscheinlich beides angehen, mit und ohne WMI, rein aus Neugier.
Danke für's sammeln und posten der links!!!

markus5766h 1. Apr 2018 13:09

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
wie wär's damit :

Delphi-Quellcode:
const
  IOCTL_STORAGE_QUERY_PROPERTY = $002D1400;

type
  STORAGE_QUERY_TYPE = (PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined);
  TStorageQueryType = STORAGE_QUERY_TYPE;

  STORAGE_PROPERTY_ID = (StorageDeviceProperty = 0, StorageAdapterProperty);
  TStoragePropertyID = STORAGE_PROPERTY_ID;

  STORAGE_PROPERTY_QUERY = packed record
    PropertyId: STORAGE_PROPERTY_ID;
    QueryType: STORAGE_QUERY_TYPE;
    AdditionalParameters: array [0..9] of AnsiChar;
  end;
  TStoragePropertyQuery = STORAGE_PROPERTY_QUERY;

  STORAGE_BUS_TYPE = (BusTypeUnknown = 0, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre,
    BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeMaxReserved = $7F);
  TStorageBusType = STORAGE_BUS_TYPE;

  STORAGE_DEVICE_DESCRIPTOR = packed record
    Version: DWORD;
    Size: DWORD;
    DeviceType: Byte;
    DeviceTypeModifier: Byte;
    RemovableMedia: Boolean;
    CommandQueueing: Boolean;
    VendorIdOffset: DWORD;
    ProductIdOffset: DWORD;
    ProductRevisionOffset: DWORD;
    SerialNumberOffset: DWORD;
    BusType: STORAGE_BUS_TYPE;
    RawPropertiesLength: DWORD;
    RawDeviceProperties: array [0..0] of AnsiChar;
  end;
 
  TStorageDeviceDescriptor = STORAGE_DEVICE_DESCRIPTOR;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetBusType(Drive: AnsiChar): TStorageBusType;
var
  H: THandle;
  Query: TStoragePropertyQuery;
  dwBytesReturned: DWORD;
  Buffer: array [0..1023] of Byte;
  sdd: TStorageDeviceDescriptor absolute Buffer;
  OldMode: UINT;
begin
  Result := BusTypeUnknown;

  OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    H := CreateFile(PChar(Format('\\.\%s:', [AnsiLowerCase(Drive)])), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
      OPEN_EXISTING, 0, 0);
    if H <> INVALID_HANDLE_VALUE then
    begin
      try
        dwBytesReturned := 0;
        FillChar(Query, SizeOf(Query), 0);
        FillChar(Buffer, SizeOf(Buffer), 0);
        sdd.Size := SizeOf(Buffer);
        Query.PropertyId := StorageDeviceProperty;
        Query.QueryType := PropertyStandardQuery;
        if DeviceIoControl(H, IOCTL_STORAGE_QUERY_PROPERTY, @Query, SizeOf(Query), @Buffer, SizeOf(Buffer), dwBytesReturned, nil) then
          Result := sdd.BusType;
      finally
        CloseHandle(H);
      end;
    end;
  finally
    SetErrorMode(OldMode);
  end;
end;

Codehunter 1. Apr 2018 13:56

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Vielleicht lohnt sich mal ein Blick hierauf. Mit der Trial geht ja auch schon viel. Ich habe die Lizenz für die Vollversion schon seit 17 Jahren. Der Michal steckt da wirklich viel Hirnschmalz rein. Was damit machbar ist kann man sich beim System Information X anschauen. Das Teil ist besser als manches kostenpflichtige Tool wie Sisoft Sandra etc.

KodeZwerg 1. Apr 2018 17:10

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
markus5766h, Danke für Deinen WMI-less Code! Der ergänzt meinen für die Schnittstellen wenn ich ihn denn nutzen darf!
Codehunter, Danke für die Vorstellung der Komponente, ich hab da gerade mal einen kleinen Blick drauf geworfen, unheimlich komplex all-in-one System Information, schaut auch prima aus! Am Dienstag sollte Delphi 10.2.3 ankommen (DVD), da probiere ich mal die Trial aus. Da Du das Vollprodukt besitzt, darf ich Dich fragen ob die Komponente auf WMI aufbaut?

himitsu 1. Apr 2018 21:00

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Welche Schnittstelle?
Mein BIOS kann auch so tun, als wenn mein SATA ein IDE wäre
und in der Standardeinstellung sieht die SSD sogar aus wie eine komplett andere stinknormale HDD.

Codehunter 1. Apr 2018 22:23

AW: Windows - Festspeicher-Schnittstelle ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1397811)
Da Du das Vollprodukt besitzt, darf ich Dich fragen ob die Komponente auf WMI aufbaut?

So weit ich das überblicken kann verwendet er kein WMI an der Stelle die dich interessieren dürfte sondern greift Low-Level über WinIOCtl darauf zu:
Delphi-Quellcode:
{*******************************************************}
{                 MiTeC Common Routines                }
{                 Low-Level Disk Access                }
{                                                       }
{         Copyright (c) 1997-2016 Michal Mutl          }
{                                                       }
{*******************************************************}

{$INCLUDE Compilers.inc}

unit MiTeC_Disk;

interface

uses {$IFDEF RAD9PLUS}
     WinAPI.Windows, System.SysUtils, System.Classes,
     {$ELSE}
     Windows, SysUtils, Classes,
     {$ENDIF}
     MiTeC_WinIOCTL;
Delphi-Quellcode:
{*******************************************************}
{               MiTeC Common Routines                  }
{          Storage Device Detection routines           }
{                                                       }
{         Copyright (c) by 1997-2018 Michal Mutl       }
{                                                       }
{*******************************************************}

{$INCLUDE Compilers.inc}

{$IFDEF RAD7PLUS}
{$WARN IMPLICIT_STRING_CAST OFF}
{$WARN IMPLICIT_STRING_CAST_LOSS OFF}
{$WARN WIDECHAR_REDUCED OFF}
{$ENDIF}

unit MiTeC_Storage;

interface

uses {$IFDEF RAD9PLUS}
     WinAPI.Windows, System.SysUtils, System.Classes,
     {$ELSE}
     Windows, SysUtils, Classes,
     {$ENDIF}
     MiTeC_WinIOCTL, MiTeC_Routines;
WMI kommt in den ganzen die Disks betreffenden Units nicht vor. Ich habe vor vielen Jahren einen (ich traus mich kaum zu sagen ^^) Floppy-basierten Kopierschutz verwendet. Die Floppy hab ich damals außerhalb des Dateisystems beschrieben und gelesen. Daran ist sogar das gute alte VGACopy gescheitert :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 Uhr.
Seite 1 von 2  1 2      

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