[NETSH] Fix helper and context issues

This commit is contained in:
Eric Kohl
2025-09-08 01:55:04 +02:00
parent 1c1b8a2260
commit df01941faf
3 changed files with 100 additions and 48 deletions

View File

@@ -39,6 +39,12 @@ AddContext(
{
PCONTEXT_ENTRY pEntry;
DPRINT("AddContext(%S)\n", pszName);
if (pParentContext)
{
DPRINT("ParentContext %S\n", pParentContext->pszContextName);
}
if (pParentContext != NULL && pszName == NULL)
return NULL;
@@ -70,7 +76,7 @@ AddContext(
/* Insert it */
if (pParentContext != NULL)
{
if (pParentContext->pSubContextHead == NULL && pParentContext->pSubContextTail == NULL)
if ((pParentContext->pSubContextHead == NULL) && (pParentContext->pSubContextTail == NULL))
{
pParentContext->pSubContextHead = pEntry;
pParentContext->pSubContextTail = pEntry;
@@ -431,7 +437,7 @@ CreateRootContext(VOID)
PCOMMAND_GROUP pGroup;
pRootContext = AddContext(NULL, NULL, NULL);
DPRINT1("pRootContext: %p\n", pRootContext);
DPRINT("pRootContext: %p\n", pRootContext);
if (pRootContext == NULL)
return FALSE;
@@ -470,13 +476,54 @@ CreateRootContext(VOID)
}
static
PCONTEXT_ENTRY
FindSubContextByGuid(
PCONTEXT_ENTRY pContext,
const GUID *pGuid)
{
PCONTEXT_ENTRY pResultContext, pSubContext;
DPRINT("FindSubContextByGuid(%p)\n", pContext);
DPRINT("%lx <--> %lx\n", pContext->Guid.Data1, pGuid->Data1);
if (IsEqualGUID(&pContext->Guid, pGuid))
{
DPRINT("Found!\n");
return pContext;
}
pSubContext = pContext->pSubContextHead;
while (pSubContext)
{
pResultContext = FindSubContextByGuid(pSubContext, pGuid);
if (pResultContext)
return pResultContext;
pSubContext = pSubContext->pNext;
}
return NULL;
}
PCONTEXT_ENTRY
FindContextByGuid(
const GUID *pGuid)
{
if (pRootContext == NULL)
return NULL;
return FindSubContextByGuid(pRootContext, pGuid);
}
DWORD
WINAPI
RegisterContext(
_In_ const NS_CONTEXT_ATTRIBUTES *pChildContext)
{
PHELPER_ENTRY pHelper;
PCONTEXT_ENTRY pContext;
PCONTEXT_ENTRY pContext, pParentContext;
PCOMMAND_GROUP pGroup;
DWORD i, j;
@@ -501,8 +548,17 @@ RegisterContext(
DPRINT("Top commands: %lu\n", pChildContext->ulNumTopCmds);
pHelper = FindHelper(&pChildContext->guidHelper, pHelperListHead);
DPRINT("Helper %p\n", pHelper);
pParentContext = pRootContext;
if (pHelper != NULL)
{
pParentContext = FindContextByGuid(&pHelper->ParentHelperGuid);
DPRINT("pParentContext %p\n", pParentContext);
if (pParentContext == NULL)
pParentContext = pRootContext;
}
pContext = AddContext(pRootContext, pChildContext->pwszContext, (GUID*)&pChildContext->guidHelper);
pContext = AddContext(pParentContext, pChildContext->pwszContext, (GUID*)&pChildContext->guidHelper);
if (pContext != NULL)
{
if ((pHelper != NULL) && (pHelper->pDllEntry != NULL))

View File

@@ -379,7 +379,7 @@ RegisterHelper(
if (FindHelper(&pHelperAttributes->guidHelper, pHelperListHead) != NULL)
{
DPRINT1("The Helper has already been registered!\n");
return 1;
return ERROR_INVALID_PARAMETER;
}
pHelper = (PHELPER_ENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HELPER_ENTRY));
@@ -395,7 +395,7 @@ RegisterHelper(
if (pguidParentHelper == NULL)
{
if (pHelperListTail == NULL)
if ((pHelperListHead == NULL) && (pHelperListTail == NULL))
{
pHelperListHead = pHelper;
pHelperListTail = pHelper;
@@ -409,6 +409,7 @@ RegisterHelper(
}
else
{
CopyMemory(&pHelper->ParentHelperGuid, pguidParentHelper, sizeof(GUID));
pParentHelper = FindHelper(pguidParentHelper, pHelperListHead);
if (pParentHelper == NULL)
{
@@ -416,7 +417,7 @@ RegisterHelper(
return ERROR_INVALID_PARAMETER;
}
if (pParentHelper->pSubHelperHead == NULL && pParentHelper->pSubHelperTail == NULL)
if ((pParentHelper->pSubHelperHead == NULL) && (pParentHelper->pSubHelperTail == NULL))
{
pParentHelper->pSubHelperHead = pHelper;
pParentHelper->pSubHelperTail = pHelper;
@@ -534,55 +535,46 @@ DeleteHelperCommand(
static
VOID
PrintSubContext(
_In_ PCONTEXT_ENTRY pParentContext,
PrintHelpers(
_In_ PHELPER_ENTRY pHelperListHead,
_In_ DWORD dwLevel)
{
PCONTEXT_ENTRY pContext;
PHELPER_ENTRY pHelper;
WCHAR szPrefix[22];
PCONTEXT_ENTRY pContext;
WCHAR szIndent[22];
DWORD i;
DPRINT("PrintSubContext(%p %lu)\n", pParentContext, dwLevel);
for (i = 0; i < min(dwLevel, 10) * 2; i++)
szIndent[i] = L' ';
szIndent[dwLevel * 2] = UNICODE_NULL;
if (pParentContext == NULL)
return;
pContext = pParentContext->pSubContextHead;
while (pContext != NULL)
pHelper = pHelperListHead;
while (pHelper != NULL)
{
pHelper = FindHelper(&pContext->Guid, pHelperListHead);
if (pHelper != NULL)
pContext = FindContextByGuid(&pHelper->Attributes.guidHelper);
if (pContext)
{
if (dwLevel > 10)
dwLevel = 10;
for (i = 0; i < dwLevel * 2; i++)
szPrefix[i] = L' ';
szPrefix[dwLevel * 2] = UNICODE_NULL;
DPRINT("Level %lu \"%S\" %S\n", dwLevel, szPrefix, pContext->pszContextName);
ConPrintf(StdOut, L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X} %-16s %s%s\n",
pHelper->Attributes.guidHelper.Data1,
pHelper->Attributes.guidHelper.Data2,
pHelper->Attributes.guidHelper.Data3,
pHelper->Attributes.guidHelper.Data4[0],
pHelper->Attributes.guidHelper.Data4[1],
pHelper->Attributes.guidHelper.Data4[2],
pHelper->Attributes.guidHelper.Data4[3],
pHelper->Attributes.guidHelper.Data4[4],
pHelper->Attributes.guidHelper.Data4[5],
pHelper->Attributes.guidHelper.Data4[6],
pHelper->Attributes.guidHelper.Data4[7],
pHelper->pDllEntry->pszShortName,
szPrefix,
pContext->pszContextName);
ConPrintf(StdOut,
L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X} %-16s %s%s\n",
pHelper->Attributes.guidHelper.Data1,
pHelper->Attributes.guidHelper.Data2,
pHelper->Attributes.guidHelper.Data3,
pHelper->Attributes.guidHelper.Data4[0],
pHelper->Attributes.guidHelper.Data4[1],
pHelper->Attributes.guidHelper.Data4[2],
pHelper->Attributes.guidHelper.Data4[3],
pHelper->Attributes.guidHelper.Data4[4],
pHelper->Attributes.guidHelper.Data4[5],
pHelper->Attributes.guidHelper.Data4[6],
pHelper->Attributes.guidHelper.Data4[7],
pHelper->pDllEntry->pszShortName,
szIndent,
pContext->pszContextName);
}
PrintSubContext(pContext, dwLevel + 1);
PrintHelpers(pHelper->pSubHelperHead, dwLevel + 1);
pContext = pContext->pNext;
pHelper = pHelper->pNext;
}
}
@@ -606,7 +598,7 @@ ShowHelperCommand(
if (pRootContext == NULL)
return ERROR_SUCCESS;
PrintSubContext(pRootContext, 0);
PrintHelpers(pHelperListHead, 0);
return ERROR_SUCCESS;
}

View File

@@ -58,6 +58,7 @@ typedef struct _HELPER_ENTRY
struct _HELPER_ENTRY *pNext;
NS_HELPER_ATTRIBUTES Attributes;
GUID ParentHelperGuid;
PDLL_LIST_ENTRY pDllEntry;
BOOL bStarted;
@@ -74,7 +75,7 @@ typedef struct _COMMAND_ENTRY
struct _COMMAND_ENTRY *pPrev;
struct _COMMAND_ENTRY *pNext;
LPCWSTR pwszCmdToken;
PWSTR pwszCmdToken;
PFN_HANDLE_CMD pfnCmdHandler;
DWORD dwShortCmdHelpToken;
DWORD dwCmdHlpToken;
@@ -86,7 +87,7 @@ typedef struct _COMMAND_GROUP
struct _COMMAND_GROUP *pPrev;
struct _COMMAND_GROUP *pNext;
LPCWSTR pwszCmdGroupToken;
PWSTR pwszCmdGroupToken;
DWORD dwShortCmdHelpToken;
DWORD dwFlags;
@@ -134,6 +135,9 @@ CreateRootContext(VOID);
VOID
CleanupContext(VOID);
PCONTEXT_ENTRY
FindContextByGuid(
_In_ const GUID *pGuid);
/* help.c */