5 /* INCLUDES *****************************************************************/
13 /* GLOBALS *******************************************************************/
15 LIST_ENTRY GroupListHead
;
16 LIST_ENTRY UnknownGroupListHead
;
19 /* FUNCTIONS *****************************************************************/
22 ScmSetServiceGroup(PSERVICE lpService
,
25 PLIST_ENTRY GroupEntry
;
26 PSERVICE_GROUP lpGroup
;
28 GroupEntry
= GroupListHead
.Flink
;
29 while (GroupEntry
!= &GroupListHead
)
31 lpGroup
= CONTAINING_RECORD(GroupEntry
, SERVICE_GROUP
, GroupListEntry
);
33 if (!_wcsicmp(lpGroup
->lpGroupName
, lpGroupName
))
35 lpService
->lpGroup
= lpGroup
;
39 GroupEntry
= GroupEntry
->Flink
;
42 GroupEntry
= UnknownGroupListHead
.Flink
;
43 while (GroupEntry
!= &UnknownGroupListHead
)
45 lpGroup
= CONTAINING_RECORD(GroupEntry
, SERVICE_GROUP
, GroupListEntry
);
47 if (!_wcsicmp(lpGroup
->lpGroupName
, lpGroupName
))
49 lpGroup
->dwRefCount
++;
50 lpService
->lpGroup
= lpGroup
;
54 GroupEntry
= GroupEntry
->Flink
;
57 lpGroup
= (PSERVICE_GROUP
)HeapAlloc(GetProcessHeap(),
59 sizeof(SERVICE_GROUP
) + (wcslen(lpGroupName
) * sizeof(WCHAR
)));
61 return ERROR_NOT_ENOUGH_MEMORY
;
63 wcscpy(lpGroup
->szGroupName
, lpGroupName
);
64 lpGroup
->lpGroupName
= lpGroup
->szGroupName
;
65 lpGroup
->dwRefCount
= 1;
67 InsertTailList(&UnknownGroupListHead
,
68 &lpGroup
->GroupListEntry
);
74 static NTSTATUS STDCALL
75 CreateGroupOrderListRoutine(PWSTR ValueName
,
84 DPRINT("CreateGroupOrderListRoutine(%S, %x, %x, %x, %x, %x)\n",
85 ValueName
, ValueType
, ValueData
, ValueLength
, Context
, EntryContext
);
87 if (ValueType
== REG_BINARY
&&
89 ValueLength
>= sizeof(DWORD
) &&
90 ValueLength
>= (*(PULONG
)ValueData
+ 1) * sizeof(DWORD
))
92 Group
= (PSERVICE_GROUP
)Context
;
93 Group
->TagCount
= ((PULONG
)ValueData
)[0];
94 if (Group
->TagCount
> 0)
96 if (ValueLength
>= (Group
->TagCount
+ 1) * sizeof(DWORD
))
98 Group
->TagArray
= (PULONG
)HeapAlloc(GetProcessHeap(),
100 Group
->TagCount
* sizeof(DWORD
));
101 if (Group
->TagArray
== NULL
)
104 return STATUS_INSUFFICIENT_RESOURCES
;
107 RtlCopyMemory(Group
->TagArray
,
108 (PULONG
)ValueData
+ 1,
109 Group
->TagCount
* sizeof(DWORD
));
114 return STATUS_UNSUCCESSFUL
;
119 return STATUS_SUCCESS
;
123 static NTSTATUS STDCALL
124 CreateGroupListRoutine(PWSTR ValueName
,
131 PSERVICE_GROUP Group
;
132 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
135 if (ValueType
== REG_SZ
)
137 DPRINT("Data: '%S'\n", (PWCHAR
)ValueData
);
139 Group
= (PSERVICE_GROUP
)HeapAlloc(GetProcessHeap(),
141 sizeof(SERVICE_GROUP
) + (wcslen(ValueData
) * sizeof(WCHAR
)));
144 return STATUS_INSUFFICIENT_RESOURCES
;
147 wcscpy(Group
->szGroupName
, ValueData
);
148 Group
->lpGroupName
= Group
->szGroupName
;
149 Group
->dwRefCount
= (DWORD
)-1;
151 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
152 QueryTable
[0].Name
= (PWSTR
)ValueData
;
153 QueryTable
[0].QueryRoutine
= CreateGroupOrderListRoutine
;
155 Status
= RtlQueryRegistryValues(RTL_REGISTRY_CONTROL
,
160 DPRINT("%x %d %S\n", Status
, Group
->TagCount
, (PWSTR
)ValueData
);
162 InsertTailList(&GroupListHead
,
163 &Group
->GroupListEntry
);
166 return STATUS_SUCCESS
;
171 ScmCreateGroupList(VOID
)
173 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
176 InitializeListHead(&GroupListHead
);
177 InitializeListHead(&UnknownGroupListHead
);
179 /* Build group order list */
180 RtlZeroMemory(&QueryTable
,
183 QueryTable
[0].Name
= L
"List";
184 QueryTable
[0].QueryRoutine
= CreateGroupListRoutine
;
186 Status
= RtlQueryRegistryValues(RTL_REGISTRY_CONTROL
,
187 L
"ServiceGroupOrder",
192 return RtlNtStatusToDosError(Status
);