Win 7 и Native API

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by transserg, 12 Nov 2009.

  1. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    привет всем! хочу перейти на 7'ку точнее поюзать, но немного нет времени для эксперементов так как скоро сдача курсача... все ли NativAPI корректно работают на ней? вопрос возник потому что на 7ке спомощью NtQurySystemInformation неполучилось вывести список драйверов на хр все робит на ура
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Win7 в принципе ничем не отличается от WinXP считай таже система.
    Писал дров который инжектил DLL из ядра в гуёвый процесс. Пахало и на win xp и на win 7 так что в принципе тоже самое.
    Возможно теперь эта функция требует права админа. Ты проверь что она возвращается. Вернее какой код ошибки. И от него уже нужно шагать
     
  3. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    slesh программа зупущенна из под админа(а именно правой кнопкой на ехе запустит с правами администратора) эффект тот же =)
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну хоть какой код возвращается NtQuerySystemInformation?
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ТАкс. пришел домой. Проверил. Под w7 RC спокойно пашет код который пашет и в winxp
    Даже не требуется прав админа.

    Так что у тебя код гдето кривой. Код в студию. ))

    лично я делал так:
    NtQuerySystemInformation(DRIVER_INFORMATION, buf, 0, &NeedSize);
    затем выделял память = NeedSize * 2
    и делал NtQuerySystemInformation(DRIVER_INFORMATION, buf, NeedSize * 2, &NeedSize);
     
  6. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    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;
    
    вот этот код =)
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    на w7 у меня отлично пашет.
     
  8. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    slesh тогда у одногруппника руки ниже талии растут раз у него этот код не работает =) тему можно закрыть
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Щас преписал в более красивый вид..
    Пашет тоже нормально.
    Там вполне возможно он не мог найти адрес 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.
    
     
    #9 slesh, 12 Nov 2009
    Last edited: 12 Nov 2009
  10. transserg

    transserg Elder - Старейшина

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    во ща выяснилось что семерка 64 битная! возмонжно в этом косяк или это не влияет?
     
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    теоретически не должно так сильно повлеять. Разве что структура могла поменять т.е. адреса 64-бита а не 32
     
  12. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    вполне могло повлиять. 64битная винда проводит политику уважения 32битного кода ровно настолько, что доступа ни к чему 64битному у него нет - даже обращения к папке System32 редиректятся на SysWOW64