Search code examples
windowswmiwmi-querywmicget-wmiobject

Getting the disk signature as negative


import wmi
wmi_connector = wmi.WMI()
def get_win_drive_mappings_locally(drivemappings):

        for physical_disk in wmi_connector.Win32_DiskDrive():
            for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
                for logical_disk in partition.associators("Win32_LogicalDiskToPartition"):
                 print (physical_disk.Signature)

I am using wmi to get information of disks and signature. when i print the instance of physical_disk the output is as below:

instance of Win32_DiskDrive
{
        BytesPerSector = 512;
        Capabilities = {3, 4};
        CapabilityDescriptions = {"Random Access", "Supports Writing"};
        Caption = "XXXXX SCSI Disk Device";
        ConfigManagerErrorCode = 0;
        ConfigManagerUserConfig = FALSE;
        CreationClassName = "Win32_DiskDrive";
        Description = "Disk drive";
        DeviceID = "\\\\.\\PHYSICALDRIVE1";
        FirmwareRevision = "0   ";
        Index = 1;
        InterfaceType = "SCSI";
        Manufacturer = "(Standard disk drives)";
        MediaLoaded = TRUE;
        MediaType = "Fixed hard disk media";
        Model = "XXXX  SCSI Disk Device";
        Name = "\\\\.\\PHYSICALDRIVE1";
        Partitions = 1;
        PNPDeviceID = "SCSI\\DISK&XXXXX&PROD_K\\4&5393C0A&0&000100";
        SCSIBus = 0;
        SCSILogicalUnit = 0;
        SCSIPort = 2;
        SCSITargetId = 1;
        SectorsPerTrack = 63;
        SerialNumber = "XXXXX";
        Signature = **3908409726**;
        Size = "107372805120";
        Status = "OK";
        SystemCreationClassName = "Win32_ComputerSystem";
        SystemName = "SQLSERVER";
        TotalCylinders = "13054";
        TotalHeads = 255;
        TotalSectors = "209712510";
        TotalTracks = "3328770";
        TracksPerCylinder = 255;
};

But when i print physical_disk.Signature the output is: -386557570, i am not able to understand where its going wrong,expected output is 3908409726


Solution

  • -386557570 is indeed 3908409726 interpreted as a 32 bit signed integer (in 2's complement arithmetic); probably the Python WMI connector interprets all 32 bit values as signed.

    To interpret it as an unsigned value, check if it's negative, and in that case add 1<<32.

    def as_uint32(v):
        if v<0:
            return v + (1<<32)
        return v
    
    # ...
    print (as_uint32(physical_disk.Signature))