чтение из реестра

Тема в разделе "WASM.BEGINNERS", создана пользователем e4key, 21 сен 2009.

  1. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Пытаюсь считать значение ключа из реестра:

    Код (Text):
    1. invoke  RegOpenKeyEx, HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, hKey
    2. mov     [mozSize], 200
    3. invoke  RegQueryValueEx, [hKey], keyName, 0, 0, mPath, mSize
    4. invoke  RegCloseKey, [hKey]
    Но почему-то данный код то выполняется как надо, то RegQueryValueEx возвращает ошибку #126. Даже в голову ничего не приходит =/ Спасибо.
     
  2. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Упс когда сюда писал ошибся - mozSize = mSize :)
     
  3. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Если это поможет, то читаю из SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    e4key
    Код (Text):
    1. // MessageText:
    2. //
    3. //  The specified module could not be found.
    4. //
    5. #define ERROR_MOD_NOT_FOUND              126L
    Код (Text):
    1. ; MessageText:
    2. ;
    3. ;  {Unable To Locate DLL}
    4. ;  The dynamic link library %hs could not be found in the specified path %hs.
    5. ;
    6. STATUS_DLL_NOT_FOUND             equ 0C0000135h
    RtlNtStatusToDosErrorNoTeb(STATUS_DLL_NOT_FOUND) = ERROR_MOD_NOT_FOUND. Тоесть LdrGetDllHandleEx() возвращает эту ошибку. Откуда там это не понятно. Могу предположить что это предыдущий код ошибки не изменяется, тоесть вы не верно условия при которой возникла ошибка определили. Далее вы будите дебажить этот код.
     
  5. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Clerk, ну собственно я проверял ошибки после RegOpenKeyEx, их там нет. Только после RegQueryValueEx. До этих функций кода вообще нет - RegOpenKeyEx первая. И что самое интересное - функция то выполняется, то не выполняется.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    e4key
    Нам всёравно. Отладчик ставьте.
     
  7. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Ну да, конечно. Запусти под отладкой и стоя на ЕП посмотри LastError. Или вызывай GetLastError первой.. уверен, там будет ERROR_MOD_NOT_FOUND. И покажи как у тебя импорт прописан.
     
  8. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    После RegOpenKeyEx вызывать GetLastError нет смысла.
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Partner
    1. IceT хотел сказать, что после загрузки LastErr может быть не ERROR_SUCCESS
    2. IceT возможно подразумевал (т.к. четко это не высказано), что API не меняют LastErr в случае успешного выполнения
    3. Контроль за LastErr осуществлять необходимо (ну хотя бы в критически важных местах)
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    max7C4
    Не все API меняют LastError. Regisry API в их числе.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Partner
    Я конечно понимаю что winerror.h малоинформативный, следует ядерные коды(ntstatus) использовать, но в среде винапи желательно первое не совмещать со вторым.
    [​IMG]
     
  12. IceT

    IceT IceT

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    233
    Адрес:
    RU
    Partner
    max7C4 разжевал уже все. После загрузки LastError часто не нулевой. А АПИ у топикстартера возвращают 0 (If the function succeeds, the return value is ERROR_SUCCESS) т.е., видимо, если RtlNtStatusToDosError возвращает не 0, только тогда вызывается SetLastError. А уж какой там MOD был NOT_FOUND - это только загрузчику известно.

    e4key, делай так:

    Код (Text):
    1. invoke  RegQueryValueEx, [hKey], keyName, 0, 0, mPath, mSize
    2. or eax,eax
    3. je .err
    4.  
    5. ; здесь GetLastError вызывать смысла нету
    6.  
    7. .err:
    8. invoke GetLastError
    9. ret