Skip to content

Commit df01941

Browse files
committed
[NETSH] Fix helper and context issues
1 parent 1c1b8a2 commit df01941

File tree

3 files changed

+100
-48
lines changed

3 files changed

+100
-48
lines changed

base/applications/network/netsh/context.c

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ AddContext(
3939
{
4040
PCONTEXT_ENTRY pEntry;
4141

42+
DPRINT("AddContext(%S)\n", pszName);
43+
if (pParentContext)
44+
{
45+
DPRINT("ParentContext %S\n", pParentContext->pszContextName);
46+
}
47+
4248
if (pParentContext != NULL && pszName == NULL)
4349
return NULL;
4450

@@ -70,7 +76,7 @@ AddContext(
7076
/* Insert it */
7177
if (pParentContext != NULL)
7278
{
73-
if (pParentContext->pSubContextHead == NULL && pParentContext->pSubContextTail == NULL)
79+
if ((pParentContext->pSubContextHead == NULL) && (pParentContext->pSubContextTail == NULL))
7480
{
7581
pParentContext->pSubContextHead = pEntry;
7682
pParentContext->pSubContextTail = pEntry;
@@ -431,7 +437,7 @@ CreateRootContext(VOID)
431437
PCOMMAND_GROUP pGroup;
432438

433439
pRootContext = AddContext(NULL, NULL, NULL);
434-
DPRINT1("pRootContext: %p\n", pRootContext);
440+
DPRINT("pRootContext: %p\n", pRootContext);
435441
if (pRootContext == NULL)
436442
return FALSE;
437443

@@ -470,13 +476,54 @@ CreateRootContext(VOID)
470476
}
471477

472478

479+
static
480+
PCONTEXT_ENTRY
481+
FindSubContextByGuid(
482+
PCONTEXT_ENTRY pContext,
483+
const GUID *pGuid)
484+
{
485+
PCONTEXT_ENTRY pResultContext, pSubContext;
486+
487+
DPRINT("FindSubContextByGuid(%p)\n", pContext);
488+
DPRINT("%lx <--> %lx\n", pContext->Guid.Data1, pGuid->Data1);
489+
490+
if (IsEqualGUID(&pContext->Guid, pGuid))
491+
{
492+
DPRINT("Found!\n");
493+
return pContext;
494+
}
495+
496+
pSubContext = pContext->pSubContextHead;
497+
while (pSubContext)
498+
{
499+
pResultContext = FindSubContextByGuid(pSubContext, pGuid);
500+
if (pResultContext)
501+
return pResultContext;
502+
503+
pSubContext = pSubContext->pNext;
504+
}
505+
506+
return NULL;
507+
}
508+
509+
510+
PCONTEXT_ENTRY
511+
FindContextByGuid(
512+
const GUID *pGuid)
513+
{
514+
if (pRootContext == NULL)
515+
return NULL;
516+
return FindSubContextByGuid(pRootContext, pGuid);
517+
}
518+
519+
473520
DWORD
474521
WINAPI
475522
RegisterContext(
476523
_In_ const NS_CONTEXT_ATTRIBUTES *pChildContext)
477524
{
478525
PHELPER_ENTRY pHelper;
479-
PCONTEXT_ENTRY pContext;
526+
PCONTEXT_ENTRY pContext, pParentContext;
480527
PCOMMAND_GROUP pGroup;
481528
DWORD i, j;
482529

@@ -501,8 +548,17 @@ RegisterContext(
501548
DPRINT("Top commands: %lu\n", pChildContext->ulNumTopCmds);
502549

503550
pHelper = FindHelper(&pChildContext->guidHelper, pHelperListHead);
551+
DPRINT("Helper %p\n", pHelper);
552+
pParentContext = pRootContext;
553+
if (pHelper != NULL)
554+
{
555+
pParentContext = FindContextByGuid(&pHelper->ParentHelperGuid);
556+
DPRINT("pParentContext %p\n", pParentContext);
557+
if (pParentContext == NULL)
558+
pParentContext = pRootContext;
559+
}
504560

505-
pContext = AddContext(pRootContext, pChildContext->pwszContext, (GUID*)&pChildContext->guidHelper);
561+
pContext = AddContext(pParentContext, pChildContext->pwszContext, (GUID*)&pChildContext->guidHelper);
506562
if (pContext != NULL)
507563
{
508564
if ((pHelper != NULL) && (pHelper->pDllEntry != NULL))

base/applications/network/netsh/helper.c

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ RegisterHelper(
379379
if (FindHelper(&pHelperAttributes->guidHelper, pHelperListHead) != NULL)
380380
{
381381
DPRINT1("The Helper has already been registered!\n");
382-
return 1;
382+
return ERROR_INVALID_PARAMETER;
383383
}
384384

385385
pHelper = (PHELPER_ENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(HELPER_ENTRY));
@@ -395,7 +395,7 @@ RegisterHelper(
395395

396396
if (pguidParentHelper == NULL)
397397
{
398-
if (pHelperListTail == NULL)
398+
if ((pHelperListHead == NULL) && (pHelperListTail == NULL))
399399
{
400400
pHelperListHead = pHelper;
401401
pHelperListTail = pHelper;
@@ -409,14 +409,15 @@ RegisterHelper(
409409
}
410410
else
411411
{
412+
CopyMemory(&pHelper->ParentHelperGuid, pguidParentHelper, sizeof(GUID));
412413
pParentHelper = FindHelper(pguidParentHelper, pHelperListHead);
413414
if (pParentHelper == NULL)
414415
{
415416
DPRINT("Parent helper not found!\n");
416417
return ERROR_INVALID_PARAMETER;
417418
}
418419

419-
if (pParentHelper->pSubHelperHead == NULL && pParentHelper->pSubHelperTail == NULL)
420+
if ((pParentHelper->pSubHelperHead == NULL) && (pParentHelper->pSubHelperTail == NULL))
420421
{
421422
pParentHelper->pSubHelperHead = pHelper;
422423
pParentHelper->pSubHelperTail = pHelper;
@@ -534,55 +535,46 @@ DeleteHelperCommand(
534535

535536
static
536537
VOID
537-
PrintSubContext(
538-
_In_ PCONTEXT_ENTRY pParentContext,
538+
PrintHelpers(
539+
_In_ PHELPER_ENTRY pHelperListHead,
539540
_In_ DWORD dwLevel)
540541
{
541-
PCONTEXT_ENTRY pContext;
542542
PHELPER_ENTRY pHelper;
543-
WCHAR szPrefix[22];
543+
PCONTEXT_ENTRY pContext;
544+
WCHAR szIndent[22];
544545
DWORD i;
545546

546-
DPRINT("PrintSubContext(%p %lu)\n", pParentContext, dwLevel);
547+
for (i = 0; i < min(dwLevel, 10) * 2; i++)
548+
szIndent[i] = L' ';
549+
szIndent[dwLevel * 2] = UNICODE_NULL;
547550

548-
if (pParentContext == NULL)
549-
return;
550-
551-
pContext = pParentContext->pSubContextHead;
552-
while (pContext != NULL)
551+
pHelper = pHelperListHead;
552+
while (pHelper != NULL)
553553
{
554-
pHelper = FindHelper(&pContext->Guid, pHelperListHead);
555-
if (pHelper != NULL)
554+
pContext = FindContextByGuid(&pHelper->Attributes.guidHelper);
555+
if (pContext)
556556
{
557-
if (dwLevel > 10)
558-
dwLevel = 10;
559-
560-
for (i = 0; i < dwLevel * 2; i++)
561-
szPrefix[i] = L' ';
562-
szPrefix[dwLevel * 2] = UNICODE_NULL;
563-
564-
DPRINT("Level %lu \"%S\" %S\n", dwLevel, szPrefix, pContext->pszContextName);
565-
566-
ConPrintf(StdOut, L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X} %-16s %s%s\n",
567-
pHelper->Attributes.guidHelper.Data1,
568-
pHelper->Attributes.guidHelper.Data2,
569-
pHelper->Attributes.guidHelper.Data3,
570-
pHelper->Attributes.guidHelper.Data4[0],
571-
pHelper->Attributes.guidHelper.Data4[1],
572-
pHelper->Attributes.guidHelper.Data4[2],
573-
pHelper->Attributes.guidHelper.Data4[3],
574-
pHelper->Attributes.guidHelper.Data4[4],
575-
pHelper->Attributes.guidHelper.Data4[5],
576-
pHelper->Attributes.guidHelper.Data4[6],
577-
pHelper->Attributes.guidHelper.Data4[7],
578-
pHelper->pDllEntry->pszShortName,
579-
szPrefix,
580-
pContext->pszContextName);
557+
ConPrintf(StdOut,
558+
L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X} %-16s %s%s\n",
559+
pHelper->Attributes.guidHelper.Data1,
560+
pHelper->Attributes.guidHelper.Data2,
561+
pHelper->Attributes.guidHelper.Data3,
562+
pHelper->Attributes.guidHelper.Data4[0],
563+
pHelper->Attributes.guidHelper.Data4[1],
564+
pHelper->Attributes.guidHelper.Data4[2],
565+
pHelper->Attributes.guidHelper.Data4[3],
566+
pHelper->Attributes.guidHelper.Data4[4],
567+
pHelper->Attributes.guidHelper.Data4[5],
568+
pHelper->Attributes.guidHelper.Data4[6],
569+
pHelper->Attributes.guidHelper.Data4[7],
570+
pHelper->pDllEntry->pszShortName,
571+
szIndent,
572+
pContext->pszContextName);
581573
}
582574

583-
PrintSubContext(pContext, dwLevel + 1);
575+
PrintHelpers(pHelper->pSubHelperHead, dwLevel + 1);
584576

585-
pContext = pContext->pNext;
577+
pHelper = pHelper->pNext;
586578
}
587579
}
588580

@@ -606,7 +598,7 @@ ShowHelperCommand(
606598
if (pRootContext == NULL)
607599
return ERROR_SUCCESS;
608600

609-
PrintSubContext(pRootContext, 0);
601+
PrintHelpers(pHelperListHead, 0);
610602

611603
return ERROR_SUCCESS;
612604
}

base/applications/network/netsh/precomp.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ typedef struct _HELPER_ENTRY
5858
struct _HELPER_ENTRY *pNext;
5959

6060
NS_HELPER_ATTRIBUTES Attributes;
61+
GUID ParentHelperGuid;
6162

6263
PDLL_LIST_ENTRY pDllEntry;
6364
BOOL bStarted;
@@ -74,7 +75,7 @@ typedef struct _COMMAND_ENTRY
7475
struct _COMMAND_ENTRY *pPrev;
7576
struct _COMMAND_ENTRY *pNext;
7677

77-
LPCWSTR pwszCmdToken;
78+
PWSTR pwszCmdToken;
7879
PFN_HANDLE_CMD pfnCmdHandler;
7980
DWORD dwShortCmdHelpToken;
8081
DWORD dwCmdHlpToken;
@@ -86,7 +87,7 @@ typedef struct _COMMAND_GROUP
8687
struct _COMMAND_GROUP *pPrev;
8788
struct _COMMAND_GROUP *pNext;
8889

89-
LPCWSTR pwszCmdGroupToken;
90+
PWSTR pwszCmdGroupToken;
9091
DWORD dwShortCmdHelpToken;
9192
DWORD dwFlags;
9293

@@ -134,6 +135,9 @@ CreateRootContext(VOID);
134135
VOID
135136
CleanupContext(VOID);
136137

138+
PCONTEXT_ENTRY
139+
FindContextByGuid(
140+
_In_ const GUID *pGuid);
137141

138142
/* help.c */
139143

0 commit comments

Comments
 (0)