Я пытаюсь понять и работать с win32file. Мне нужно взять USN Journals и с трудом понять фрагменты кода, которые я нашел в Интернете. Это фрагмент кода, который я нашел -
format = 'qqqqqLLLLqqqqq'
length = struct.calcsize(format)
out_buffer = win32file.DeviceIoControl(volh, winioctlcon.FSCTL_GET_NTFS_VOLUME_DATA, None, length)
data = struct.unpack(format, out_buffer)
Теперь я действительно ржавый, когда дело доходит до C и его структур. На данный момент я понял, что format
- это 96-байтовый буфер, и он получит вывод из DeviceIoControl
Поэтому я попытался изменить формат на 'QQQQQQQQQQQQQQQQQQQ'
, чтобы посмотреть, что произойдет (чтобы увидеть, потому что я отчасти не понимаю, что на самом деле может произойти), и оказалось, что на этот раз я получил больший out_buffer
. Вот я и подумал распаковать его -
struct.unpack(format, out_buffer)
И для меня сюрприз, я получил -
struct.error: unpack requires a string argument of length 152
Поэтому я добавил еще один 'Q', чтобы увеличить размер, и получил тот же результат. Я не понимаю, почему «qqqqqLLLLqqqqq» работает, а «QQQQQQQQQQQQQQQQQQQ» - нет. Так что мои вопросы -
Насколько я понимаю, мы можем распаковать, если буфер был больше, чем вывод, так почему распаковка не работает?
Придется ли мне запоминать эти форматы каждый раз, когда я хочу получить что-то из DeviceIoControl?
Указание мне на ресурсы также было бы дополнительным бонусом, так как мне нужно основываться на коде для чтения USN Journal, и я не думаю, что хит-парад приведет меня куда-либо