EnumProcessModules ERROR_PARTIAL_COPY

Тема в разделе "WASM.WIN32", создана пользователем GoldFinch, 25 мар 2010.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ОС - Win7 x64
    запускаю 32разрядную прогу 32разрядной прогой, и пытаюсь вызвать EnumProcessModules
    получаю ошибку ERROR_PARTIAL_COPY (12Bh, 299d)

    msdn говорит что
    но это вроде бы не тот случай, т.к. запускаемая прога 32разрядная

    при попытке заменить EnumProcessModules на EnumProcessModulesEx выдается та же ошибка

    Код (Text):
    1. include 'win32ax.inc'
    2. .code
    3. entry $
    4.         invoke GetStartupInfoA, startupInfo
    5.         invoke CreateProcessA, target, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, startupInfo, processInfo
    6.         invoke EnumProcessModules, [processInfo.hProcess], modules, 1024*4, cbNeeded
    7.         int3 ; for debug
    8.  
    9.         ret
    10.  
    11. .data
    12.  
    13. target db "hello.exe", 0
    14.  
    15. processInfo PROCESS_INFORMATION
    16. startupInfo STARTUPINFO
    17.  
    18. cbNeeded dd ?
    19. modules dd 1024 dup ?
    20.  
    21. section '.idata' import data readable writeable
    22.  
    23.   library \
    24.         kernel32, 'KERNEL32.DLL',\
    25.         psapi, 'PSAPI.DLL'
    26.  
    27.   include 'api\kernel32.inc'
    28.  
    29.   import psapi, \
    30.         EnumProcessModulesEx, 'EnumProcessModulesEx'
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    (fix: в последней строчке файла import psapi, EnumProcessModules, 'EnumProcessModules')
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Процесс скорее всего не успевает инициализироваться.
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    мде...
    действительно, убрал CREATE_SUSPENDED - не помогло,
    добавил Sleep(1000) - все заработало =\

    l_inc, спасибо!
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Июп. EnumProcessModules получает информацию из Peb.Ldr. После возврата из CreateProcess(CREATE_SUSPENDED) первичный поток новосозданного процесса остановлен – и не исполнил ни одной инструкции в юзермоде. Соответственно, база данных лоадера не заполнена (для wow64 не заполена ни 32х-битная, ни 64х-битная её часть).
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Чекайте переменную LdrpLdrDatabaseIsSetup. Когда установится в 1, то лодер полностью инициализировался. Линк на неё наёдёте из LdtpInitializeProcess().
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    *LdrpInitializeProcess().