Einzelnen Beitrag anzeigen

dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#20

Re: Problem beim auslesen der Festplatten Seriennummer

  Alt 26. Okt 2006, 13:47
Hallo,

ich habe jetzt eine Möglichkeit gefunden. Naja so halb ... *g
Ich habe eine Möglichkeit in c++ gefunden die funktioniert und kämpfe mit der Übersetzung

Hab leider nur rudimentäre c++ kenntnisse

Also die c++ Lösung gibt es hier:

diskid32, ist freeware und darf weiterverwendet werden.

Es wird im Prinzip auch die S.M.A.R.T. Werte ausgelesen wie ich es schon mache, nur das man es über eine Backdoor als angebliches scsi laufwerk anspricht und so windows austrickst *so habe ich das verstanden*

Falls sich jemand berufen fühlt mir bei der Übersetzung zu helfen

Es hapert im Moment an der Übersetzung der
STORAGE_PROPERTY_QUERY query; Das ist ein selbstdefiniertes struct von ihm weiter oben das auf eine(für mich nicht verständliche) Weise von IOCTL_STORAGE_BASE erbt. Oder so *g

Ich würde mich freuen wenn mir jemand helfen könnte
Ich hänge mal den c++ code als attachment an und hier ist die fragliche Funktion
Code:
int ReadPhysicalDriveInNTWithZeroRights (void)
{
   int done = FALSE;
   int drive = 0;

   for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
   {
      HANDLE hPhysicalDriveIOCTL = 0;

         //  Try to get a handle to PhysicalDrive IOCTL, report failure
         //  and exit if can't.
      char driveName [256];

      sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);

         //  Windows NT, Windows 2000, Windows XP - admin rights not required
      hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
      // if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
      //    printf ("Unable to open physical drive %d, error code: 0x%lX\n",
      //            drive, GetLastError ());

      if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
      {
       STORAGE_PROPERTY_QUERY query;
         DWORD cbBytesReturned = 0;
       char buffer [10000];

         memset ((void *) & query, 0, sizeof (query));
       query.PropertyId = StorageDeviceProperty;
       query.QueryType = PropertyStandardQuery;

       memset (buffer, 0, sizeof (buffer));

         if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
                   & query,
                   sizeof (query),
               & buffer,
               sizeof (buffer),
                   & cbBytesReturned, NULL) )
         {         
          STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
          char serialNumber [1000];
          char modelNumber [1000];

          strcpy (serialNumber,
                flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset]));
          strcpy (modelNumber, & buffer [descrip -> ProductIdOffset]);
          if (0 == HardDriveSerialNumber [0] &&
                  //  serial number must be alphanumeric
                     //  (but there can be leading spaces on IBM drives)
               (isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
          {
            strcpy (HardDriveSerialNumber, serialNumber);
            strcpy (HardDriveModelNumber, modelNumber);
            done = TRUE;
          }
Gruß Oliver
Angehängte Dateien
Dateityp: cpp diskid32_208.cpp (36,6 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat