Eryk Sun added the comment:

As a workaround you can open a file descriptor via os.open:

    >>> import os
    >>> fd = os.open(r'\\.\PhysicalDrive0', os.O_RDONLY | os.O_BINARY)
    >>> os.read(fd, 512)[:8]
    b'3\xc0\x8e\xd0\xbc\x00|\x8e'

> _Py_fstat result not used on windows in this place. 

While it's pretty much useless, it is possible to open a CRT file descriptor 
for a directory handle:

    >>> h = _winapi.CreateFile('C:\\', 0x80000000, 3, 0, 3, 0x02000000, 0)
    >>> fd = msvcrt.open_osfhandle(h, os.O_RDONLY)
    >>> open(fd)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IsADirectoryError: [Errno 21] Is a directory: 3

So calling _Py_fstat shouldn't be skipped on Windows.

The issue is that a raw disk device doesn't support querying information 
(IRP_MJ_QUERY_INFORMATION), as shown in this local kernel debugging session:

    lkd> !object \GLOBAL??\PhysicalDrive0
    [...]
        Target String is '\Device\Harddisk0\DR0'

    lkd> !object \Device\Harddisk0\DR0
    Object: ffffe001c4fa4500  Type: (ffffe001c3d7bd30) Device
    [...]

    lkd> !devobj ffffe001c4fa4500
    Device object (ffffe001c4fa4500) is for:
     DR0 \Driver\disk DriverObject ffffe001c4fa3310
    [...]

    lkd> !drvobj \Driver\disk 2
    [...]
    Dispatch routines:
    [...]
    [05] IRP_MJ_QUERY_INFORMATION  fffff8037251a06c  nt!IopInvalidDeviceRequest
    [06] IRP_MJ_SET_INFORMATION    fffff8037251a06c  nt!IopInvalidDeviceRequest
    [...]

Specifically WinAPI GetFileInformationByHandle calls the system function 
NtQueryInformationFile. The system call makes an IRP_MJ_QUERY_INFORMATION I/O 
request of the driver, which for a raw disk device is handled by 
IopInvalidDeviceRequest. This fails the request with 
STATUS_INVALID_DEVICE_REQUEST (0xC0000010), which translates to WinAPI 
ERROR_INVALID_FUNCTION (0x0001). 

Possibly in the case of ERROR_INVALID_FUNCTION, FileIO can just call 
PyErr_Clear and skip the code that uses fdfstat.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25639>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to