привет всем! хочу перейти на 7'ку точнее поюзать, но немного нет времени для эксперементов так как скоро сдача курсача... все ли NativAPI корректно работают на ней? вопрос возник потому что на 7ке спомощью NtQurySystemInformation неполучилось вывести список драйверов на хр все робит на ура
Win7 в принципе ничем не отличается от WinXP считай таже система. Писал дров который инжектил DLL из ядра в гуёвый процесс. Пахало и на win xp и на win 7 так что в принципе тоже самое. Возможно теперь эта функция требует права админа. Ты проверь что она возвращается. Вернее какой код ошибки. И от него уже нужно шагать
slesh программа зупущенна из под админа(а именно правой кнопкой на ехе запустит с правами администратора) эффект тот же =)
ТАкс. пришел домой. Проверил. Под w7 RC спокойно пашет код который пашет и в winxp Даже не требуется прав админа. Так что у тебя код гдето кривой. Код в студию. )) лично я делал так: NtQuerySystemInformation(DRIVER_INFORMATION, buf, 0, &NeedSize); затем выделял память = NeedSize * 2 и делал NtQuerySystemInformation(DRIVER_INFORMATION, buf, NeedSize * 2, &NeedSize);
Code: var NtQuerySystemInformation: function (infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: TPDword): DWORD; stdcall; procedure GetInstallDriver; var temp, Index, numBytes, numEntries: DWORD; buf: TPDword; driverInfo: ^TDriverInfo; begin if @NtQuerySystemInformation = nil then NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),'NtQuerySystemInformation'); NtQuerySystemInformation(DRIVER_INFORMATION, @temp, 0, @numBytes); buf := AllocMem(numBytes * 2); NtQuerySystemInformation(DRIVER_INFORMATION, buf, numBytes * 2, @numBytes); numEntries := buf^; driverInfo := Pointer(DWORD(buf) + 12); for Index := 1 to numEntries do begin Writeln(Format('| $%-5s | %-48s |',[IntToHex(DWORD(driverInfo^.Address),8),driverInfo^.Name])); Inc(driverInfo); end; FreeMem(buf); end; вот этот код =)
slesh тогда у одногруппника руки ниже талии растут раз у него этот код не работает =) тему можно закрыть
Щас преписал в более красивый вид.. Пашет тоже нормально. Там вполне возможно он не мог найти адрес ntdll.dll из которой брал функцию NtQuerySystemInformation. Такое редко но может быть. Так что пусть попробует этот код. Если и он незаработает значит у него какаято защита установлена или вирь. Code: const DRIVER_INFORMATION = 11; type TDriverInfo = packed record Address : DWORD; Unknown1 : DWORD; Unknown2 : DWORD; EntryIndex : DWORD; Unknown4 : DWORD; Name: array [0..MAX_PATH + 3] of Char; end; TDriverQueryInfo = packed record Count : integer; Unknown1 : DWORD; Unknown2 : DWORD; Drv : array [0..0] of TDriverInfo; end; PDriverQueryInfo = ^TDriverQueryInfo; function NtQuerySystemInformation (infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: PDword): DWORD; stdcall; external 'ntdll.dll'; procedure GetInstallDriver; var NeedByte : dword; Info : PDriverQueryInfo; x : integer; begin NtQuerySystemInformation(DRIVER_INFORMATION, nil, 0, @NeedByte); Info := AllocMem(NeedByte * 2); NtQuerySystemInformation(DRIVER_INFORMATION, Info, NeedByte * 2, @NeedByte); for x := 0 to Info^.Count-1 do begin Writeln(Format('| $%-5s | %-48s |', [IntToHex(Info^.Drv[x].Address, 8), Info^.Drv[x].Name])); end; FreeMem(Info); end; begin GetInstallDriver(); readln; end.
теоретически не должно так сильно повлеять. Разве что структура могла поменять т.е. адреса 64-бита а не 32
вполне могло повлиять. 64битная винда проводит политику уважения 32битного кода ровно настолько, что доступа ни к чему 64битному у него нет - даже обращения к папке System32 редиректятся на SysWOW64