DeviceIOControl calls respond with parameter incorrect

Doug Campbell <[email protected]>
Newsgroups gmane.comp.python.windows
Message-ID <BLAPR20MB4180A4D898F61E287AF97F27C78E9@BLAPR20MB4180.namprd20.prod.outlook.com>
In my python 2 script, I am trying to connect to the VeraCrypt device driver to get some information on my mounted volumes.

This is what I have so far.  I tried a bunch of different ideas on how to construct the input buffer for the DeviceIoControl function call but I keep getting the following response.

Traceback (most recent call last):
  File "test.py", line 188, in <module>
    info=win32file.DeviceIoControl(hDisk,VC_IOCTL_GET_VOLUME_PROPERTIES,b'x05x00x00x00' + (b'x00' * 702),65536)
pywintypes.error: (87, 'DeviceIoControl', 'The parameter is incorrect.')


I would appreciate any direction anyone can give.  I have seen success with making calls to win32file.DeviceIoControl when an input buffer wasn't needed but this one needs this information passed to it for it to work.

Thanks!
Doug

=======
import ctypes
import win32api
import win32file
import win32con
import winioctlcon
import struct

# https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/d4drvif/nf-d4drvif-ctl_code
# https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/specifying-device-types
FILE_DEVICE_UNKNOWN=0x00000022

METHOD_BUFFERED=0
METHOD_IN_DIRECT=1
METHOD_OUT_DIRECT=2
METHOD_NEITHER=3

FILE_ANY_ACCESS=0x0000
FILE_READ_ACCESS=0x0001
FILE_WRITE_ACCESS=0x0002

def CTL_CODE(DeviceType, Function, Method, Access):
    return (DeviceType << 16) | (Access << 14) | (Function << 2) | Method

#define VC_IOCTL(CODE) (CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800 + (CODE), METHOD_BUFFERED, FILE_ANY_ACCESS))
def VC_IOCTL(CODE):
    return (CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800 + (CODE), METHOD_BUFFERED, FILE_ANY_ACCESS))

VC_IOCTL_GET_MOUNTED_VOLUMES = VC_IOCTL(6)
VC_IOCTL_GET_VOLUME_PROPERTIES = VC_IOCTL (7)
VC_IOCTL_GET_BOOT_ENCRYPTION_STATUS = VC_IOCTL (18)
VC_IOCTL_GET_BOOT_DRIVE_VOLUME_PROPERTIES = VC_IOCTL (22)
VC_IOCTL_EMERGENCY_CLEAR_KEYS = VC_IOCTL (41)

INVALID_HANDLE_VALUE=-1
FILE_SHARE_READ=0x00000001
FILE_SHARE_WRITE=0x00000002
OPEN_EXISTING=3
path = "\\\\.\\VeraCrypt"
access_flag = 0
share_flag = FILE_SHARE_READ | FILE_SHARE_WRITE

hDisk = win32file.CreateFile(path,0,win32file.FILE_SHARE_READ|win32file.FILE_SHARE_WRITE,None,win32file.OPEN_EXISTING,0,None)

class VOLUME_PROPERTIES_STRUCT(ctypes.Structure):
    _fields_ = [('driveNo', ctypes.c_int),
                ('uniqueId', ctypes.c_int),
                ('wszVolume', ctypes.c_wchar * 260),
                ('diskLength', ctypes.c_uint64),
                ('ea', ctypes.c_int),
                ('mode', ctypes.c_int),
                ('pkcs5', ctypes.c_int),
                ('pkcs5Iterations', ctypes.c_int),
                ('hiddenVolume', ctypes.c_long),
                ('readOnly', ctypes.c_long),
                ('removable', ctypes.c_long),
                ('partitionInInactiveSysEncScope', ctypes.c_long),
                ('volFormatVersion', ctypes.c_uint32),
                ('totalBytesRead', ctypes.c_uint64),
                ('totalBytesWritten', ctypes.c_uint64),
                ('hiddenVolProtection', ctypes.c_int),
                ('volFormatVersion', ctypes.c_int),
                ('volumePim', ctypes.c_int),
                ('wszLabel', ctypes.c_wchar * 33),
                ('bDriverSetLabel', ctypes.c_long),
                ('volumeID', ctypes.c_wchar * 32),
                ('mountDisabled', ctypes.c_long)]


prop = VOLUME_PROPERTIES_STRUCT()
prop.driveNo = 5

#info=win32file.DeviceIoControl(hDisk,VC_IOCTL_GET_VOLUME_PROPERTIES,struct.pack('ii520sQiiiiLLLLLQQiii66sL64sL',prop),17424)
#info=win32file.DeviceIoControl(hDisk,VC_IOCTL_GET_VOLUME_PROPERTIES,struct.pack('ii520sQiiiiLLLLLQQiii66sL64sL',5,0,'a' * 520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'a' * 66,0,'a' * 64,0),17424)
info=win32file.DeviceIoControl(hDisk,VC_IOCTL_GET_VOLUME_PROPERTIES,b'0x00' + b'x05x00x00x00' + b'x00' * 702),65536)


I based what I have done on the following C code from VeraStatus (veracrypt/VeraStatus: Command line tool to get technical information about VeraCrypt mounted volumes and system encryption (github.com)<https://github.com/veracrypt/VeraStatus>).  Here are what I believe are relevant sections.


#define VC_IOCTL(CODE) (CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800 + (CODE), METHOD_BUFFERED, FILE_ANY_ACCESS))

#define VC_IOCTL_GET_MOUNTED_VOLUMES VC_IOCTL (6)

#define VOLUME_ID_SIZE 32

typedef struct
{
int driveNo;
int uniqueId;
wchar_t wszVolume[260];
unsigned __int64 diskLength;
int ea;
int mode;
int pkcs5;
int pkcs5Iterations;
BOOL hiddenVolume;
BOOL readOnly;
BOOL removable;
BOOL partitionInInactiveSysEncScope;
unsigned __int32 volumeHeaderFlags;
unsigned __int64 totalBytesRead;
unsigned __int64 totalBytesWritten;
int hiddenVolProtection;
int volFormatVersion;
int volumePim;
wchar_t wszLabel[33];
BOOL bDriverSetLabel;
unsigned char volumeID[VOLUME_ID_SIZE];
BOOL mountDisabled;
} VOLUME_PROPERTIES_STRUCT;

VOLUME_PROPERTIES_STRUCT prop;

prop.driveNo = _totupper(argv[1][0]) - TEXT('A');

if (DeviceIoControl (hDriver, VC_IOCTL_GET_VOLUME_PROPERTIES, &prop, sizeof (prop), &prop, sizeof (prop), &cbBytesReturned, NULL))

_______________________________________________
python-win32 mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-win32
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.