[python-win32] Does pywin32 support SD card operation(IOCTL_SFFDISK_QUERY_DEVICE_PROTOCOL)?

Jane Chen janechen_1979 at yahoo.com
Wed Jul 18 21:09:10 CEST 2012


I want my script to tell if the removable disk is an SD card or not, so I wrote the following script.

buf_fmt='HHLLLL'  
buf_size=struct.calcsize(buf_fmt)

drives = (drive for drive in win32api.GetLogicalDriveStrings ().split ("\\\000") if drive)
        for drive in drives:
            if win32file.GetDriveType (drive)==2:
                print "Removable Disk" , drive
                if 'A' in drive:
                    print "floppy"
                else:
                    drive="\\\\.\\"+drive+'.'
    print drive
                    hVol = win32file.CreateFile(drive, win32con.GENERIC_READ|win32con.GENERIC_WRITE,
                        win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING,
                        0, None)
                    if hVol == win32file.INVALID_HANDLE_VALUE:   
                        print "could not open device"                      

                    buf=win32file.DeviceIoControl(hVol, winioctlcon.IOCTL_SFFDISK_QUERY_DEVICE_PROTOCOL,None,buf_size,None)
                    size_SFFDISK, reserved_SFFDISK, protocolGUID_SFFDISK=struct.unpack(buf_fmt, buf)                    
                    
            else:
                print "Not a removable disk:" , drive    

I printed out the drive letter in the script and checked the letter with the SD card letter on win7. The letters are the same. However, as I mentioned, I get (1, 'DeviceIoControl', 'Incorrect function').


Thank you,
Jane
>
> Thank you for your help.  
> Could you please help me write better codes for GUID? What are you going to do with it?  You will get back a 20-byte string. 
The last 16-bytes are the binary GUID.  The way you handle that depends
on what you need to do with it. > You are right. I was using USB. 
> Based on your suggestion, I connected the SD drive directly to a PCI
> bus and set buf_fmt='HHLLLL'. However, I got another error message:
> (1, 'DeviceIoControl', 'Incorrect function'). I think I did not use
> the function correctly. How are you specifying the volume?  You should be using a string like
"\\\\.\\E:" to open the volume for the E: drive (where the backslashes
are doubled because of Python's string escaping). I get "incorrect function" if I try to use this on a standard disk drive.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20120718/bdef3bf6/attachment.html>


More information about the python-win32 mailing list