Задача: скрыть определенные параметры в реесте. Вариант 1: возвращается ERROR_NO_MORE_ITEMS если текущий параметр совпадает с тем который нужно скрыть. Недостаток. Параметры которые идут после скрываемого отображены не будут. Вариант 2: вызывающей программе возвращается следующий за скрываемым параметр. Недостаток: этот "следующий параметр" отобразится в списке 2 раза. Вариант 3, (код ниже) комбинация варианта 2 + в глобальную переменную сохраняется количество скрытых параметров, а при следующем вызове добавляется к Index. Недостаток: если параметры будут запрашиваться не по порядку Index, или начинаться не с 0го Index, то будут лезть баги в виде повторения некоторых параметров, или отображение не всех параметров. NewRegEnumValue - вариант 3: Код (Text): .data nHdnCount dd 0 ; Hidden records counter (for delta) .code ;; -------------------------------------------------------------------------------- ;; IsHiddenRegValue proc cmp byte ptr [ebx], "C" je @hide ;; Not hide xor ebx, ebx ret @hide: ret IsHiddenRegValue endp ;; -------------------------------------------------------------------------------- ;; NewRegEnumValue proc p1:dword, p2:dword, p3:dword, p4:dword, p5:dword, p6:dword, p7:dword, p8:dword local RealRegEnumValue : dword mov RealRegEnumValue, eax ; Init counter if search from begining .if p2==0 mov nHdnCount, 0 ; else add delta to dwIndex .else mov eax, nHdnCount add p2, eax .endif @RegEnumValue: push p8 ; lpcbData push p7 ; lpData push p6 ; lpType push p5 ; lpReserved push p4 ; lpcchValueName push p3 ; lpValueName push p2 ; dwIndex push p1 ; hKey call RealRegEnumValue ; Real RegEnumValue .if eax!=ERROR_SUCCESS ret .endif pushad ; Decision: to hide or not to hide mov ebx, p3 call IsHiddenRegValue .if ebx==0 popad ret .endif ; Hide Value (replace by next) inc p2 ; Next dwIndex inc nHdnCount ; Increase counter (for delta) popad jmp @RegEnumValue NewRegEnumValue endp Вопрос вот в чем... Есть ли варинт который лишен всех этих недостатков ?
Держите у себя индекс соего параметра, и если переданный в функцию индекс больше либо равен вашему индексу, то передаёте ориг. функции индекс на 1 больше.
Хранить индекс скрываемого параметра не очень удобно. Если в ключ добавляются новые параметры другими программами, например в ветку ".../Run". Индекс который нужно скрывать может измениться. И еще если нужно будет спрятать 2 параметра в одном ключе то функции нужно будет передавать уже +2. В приведенном коде уже реализовано скрытие любого количества параметров начинающихся с буквы "C". Недостатки кода я описал Хотя Вы навели меня на мысль что можно хранить еще индекс который в последний раз был передан в RegEnumValue и сравнивать его со следующим переданным. Если вызов идет не по порядку то сбрасывать переменную с количеством скрытых параметров...
Хранить таблицу индексов(передавать следующий индекс в таблице), перестраивать её каждый раз при вызове этой апи, либо синхронно апдейтить из другого потока, ожидающего апдейт в NtNotifyChangeKey(не помню имя обёртки для этого сервиса).
Гуглил RegEnumValue и ZwEnumerateValueKey, а в статьях сейчас нашел NtEnumerateValueKey. Предложеный способ "И снова мы должны вычислить сдвиг, перевызывая функцию для всех индексов от 0 до Index" - то что нужно. Переделал обработчик под ZwEnumerateValueKey. Все работает, всем спасибо.