mirror of
https://github.com/reactos/reactos
synced 2025-10-06 00:12:51 +02:00
[NETSH] Fix helper and context issues
This commit is contained in:
@@ -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))
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 */
|
||||
|
||||
|
Reference in New Issue
Block a user