|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/5] Refactor monitor.c registry enumeration
Hi,
On 06/02/2026 09:45, Owen Smith wrote:
> Move registry enumeration code into a function, using a callback that is
> called
> for each sub key of the specified key.
>
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
Could you rebase this patch in your next series? I haven't had the time
to look at this in detail.
Thanks,
> ---
> src/monitor/monitor.c | 149 ++++++++++++++++++++++++++++--------------
> 1 file changed, 100 insertions(+), 49 deletions(-)
>
> diff --git a/src/monitor/monitor.c b/src/monitor/monitor.c
> index 1154de5..52311aa 100644
> --- a/src/monitor/monitor.c
> +++ b/src/monitor/monitor.c
> @@ -856,23 +856,25 @@ fail1:
> return;
> }
>
> -static VOID
> -CheckRequestSubKeys(
> - VOID
> +typedef BOOLEAN(*PREGENUM_FUNC)(HKEY, PTSTR, PVOID);
> +
> +static HRESULT
> +RegEnumSubKeys(
> + _In_ HKEY BaseKey,
> + _In_ PREGENUM_FUNC Callback,
> + _In_opt_ PVOID Context
> )
> {
> - PMONITOR_CONTEXT Context = &MonitorContext;
> DWORD SubKeys;
> DWORD MaxSubKeyLength;
> DWORD SubKeyLength;
> PTSTR SubKeyName;
> DWORD Index;
> - HKEY SubKey;
> HRESULT Error;
>
> Log("====>");
>
> - Error = RegQueryInfoKey(Context->RequestKey,
> + Error = RegQueryInfoKey(BaseKey,
> NULL,
> NULL,
> NULL,
> @@ -896,14 +898,10 @@ CheckRequestSubKeys(
> goto fail2;
>
> for (Index = 0; Index < SubKeys; Index++) {
> - DWORD Length;
> - DWORD Type;
> - DWORD Reboot;
> -
> SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
> memset(SubKeyName, 0, SubKeyLength);
>
> - Error = RegEnumKeyEx(Context->RequestKey,
> + Error = RegEnumKeyEx(BaseKey,
> Index,
> (LPTSTR)SubKeyName,
> &SubKeyLength,
> @@ -918,59 +916,112 @@ CheckRequestSubKeys(
>
> Log("%s", SubKeyName);
>
> - Error = RegOpenKeyEx(Context->RequestKey,
> - SubKeyName,
> - 0,
> - KEY_READ,
> - &SubKey);
> - if (Error != ERROR_SUCCESS)
> - continue;
> + if (!Callback(BaseKey, SubKeyName, Context))
> + break;
> + }
>
> - Length = sizeof (DWORD);
> - Error = RegQueryValueEx(SubKey,
> - "Reboot",
> - NULL,
> - &Type,
> - (LPBYTE)&Reboot,
> - &Length);
> - if (Error != ERROR_SUCCESS ||
> - Type != REG_DWORD)
> - goto loop;
> + free(SubKeyName);
>
> - if (Reboot != 0)
> - goto found;
> + return ERROR_SUCCESS;
>
> -loop:
> - RegCloseKey(SubKey);
> +fail3:
> + Log("fail3");
> +
> + free(SubKeyName);
> +
> +fail2:
> + Log("fail2");
> +
> +fail1:
> + Error = GetLastError();
> +
> + {
> + PTSTR Message;
> + Message = GetErrorMessage(Error);
> + Log("fail1 (%s)", Message);
> + LocalFree(Message);
> }
>
> - Error = RegDeleteValue(Context->ParametersKey,
> - "RebootCount");
> - if (Error == ERROR_SUCCESS)
> - (VOID) RegFlushKey(Context->ParametersKey);
> + return Error;
> +}
>
> - goto done;
> +static BOOLEAN
> +CheckRequestSubKey(
> + _In_ HKEY BaseKey,
> + _In_ PTSTR SubKeyName,
> + _In_opt_ PVOID Context
> + )
> +{
> + DWORD Length;
> + DWORD Reboot;
> + DWORD Type;
> + HKEY SubKey;
> + HRESULT Error;
> + PBOOLEAN Found = (PBOOLEAN)Context;
>
> -found:
> - RegCloseKey(SubKey);
> + Error = RegOpenKeyEx(BaseKey,
> + SubKeyName,
> + 0,
> + KEY_READ,
> + &SubKey);
> + if (Error != ERROR_SUCCESS)
> + return TRUE;
> +
> + Length = sizeof (DWORD);
> + Error = RegQueryValueEx(SubKey,
> + "Reboot",
> + NULL,
> + &Type,
> + (LPBYTE)&Reboot,
> + &Length);
> + if (Error != ERROR_SUCCESS ||
> + Type != REG_DWORD)
> + goto loop;
> +
> + if (Reboot == 0)
> + goto loop;
>
> - if (!Context->RebootRequestedBy)
> + if (Found != NULL)
> + *Found = TRUE;
> +
> + if (!MonitorContext.RebootRequestedBy)
> TryAutoReboot(SubKeyName);
>
> -done:
> - free(SubKeyName);
> +loop:
> + RegCloseKey(SubKey);
>
> - Log("<====");
> + return (Found != NULL) ? !(*Found) : TRUE;
> +}
>
> - return;
> +static VOID
> +CheckRequestSubKeys(
> + VOID
> + )
> +{
> + PMONITOR_CONTEXT Context = &MonitorContext;
> + BOOLEAN Found;
> + HRESULT Error;
>
> -fail3:
> - Log("fail3");
> + Log("====>");
>
> - free(SubKeyName);
> + Found = FALSE;
>
> -fail2:
> - Log("fail2");
> + Error = RegEnumSubKeys(Context->RequestKey,
> + CheckRequestSubKey,
> + &Found);
> + if (Error != ERROR_SUCCESS)
> + goto fail1;
> +
> + if (!Found) {
> + Error = RegDeleteValue(Context->ParametersKey,
> + "RebootCount");
> + if (Error == ERROR_SUCCESS)
> + (VOID) RegFlushKey(Context->ParametersKey);
> + }
> +
> + Log("<====");
> +
> + return;
>
> fail1:
> Error = GetLastError();
--
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |