https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4e32ad36235ac8608c8f0e...
commit 4e32ad36235ac8608c8f0ea302cea7243737db24 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sun Aug 5 01:05:52 2018 +0200 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Sun Aug 5 01:05:52 2018 +0200
[LSASRV] Implement and call the policy change notification routine --- dll/win32/lsasrv/lsarpc.c | 10 +++++++++ dll/win32/lsasrv/lsasrv.h | 4 ++++ dll/win32/lsasrv/notify.c | 53 ++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/dll/win32/lsasrv/lsarpc.c b/dll/win32/lsasrv/lsarpc.c index 5f314e8c2b..987d9701c6 100644 --- a/dll/win32/lsasrv/lsarpc.c +++ b/dll/win32/lsasrv/lsarpc.c @@ -707,21 +707,29 @@ NTSTATUS WINAPI LsarSetInformationPolicy( case PolicyAuditEventsInformation: /* 2 */ Status = LsarSetAuditEvents(PolicyObject, (PLSAPR_POLICY_AUDIT_EVENTS_INFO)PolicyInformation); + if (NT_SUCCESS(Status)) + LsapNotifyPolicyChange(PolicyNotifyAuditEventsInformation); break;
case PolicyPrimaryDomainInformation: /* 3 */ Status = LsarSetPrimaryDomain(PolicyObject, (PLSAPR_POLICY_PRIMARY_DOM_INFO)PolicyInformation); + if (NT_SUCCESS(Status)) + LsapNotifyPolicyChange(PolicyNotifyDnsDomainInformation); break;
case PolicyAccountDomainInformation: /* 5 */ Status = LsarSetAccountDomain(PolicyObject, (PLSAPR_POLICY_ACCOUNT_DOM_INFO)PolicyInformation); + if (NT_SUCCESS(Status)) + LsapNotifyPolicyChange(PolicyNotifyAccountDomainInformation); break;
case PolicyLsaServerRoleInformation: /* 6 */ Status = LsarSetServerRole(PolicyObject, (PPOLICY_LSA_SERVER_ROLE_INFO)PolicyInformation); + if (NT_SUCCESS(Status)) + LsapNotifyPolicyChange(PolicyNotifyServerRoleInformation); break;
case PolicyReplicaSourceInformation: /* 7 */ @@ -747,6 +755,8 @@ NTSTATUS WINAPI LsarSetInformationPolicy( case PolicyDnsDomainInformation: /* 12 (0xC) */ Status = LsarSetDnsDomain(PolicyObject, (PLSAPR_POLICY_DNS_DOMAIN_INFO)PolicyInformation); + if (NT_SUCCESS(Status)) + LsapNotifyPolicyChange(PolicyNotifyDnsDomainInformation); break;
case PolicyDnsDomainInformationInt: /* 13 (0xD) */ diff --git a/dll/win32/lsasrv/lsasrv.h b/dll/win32/lsasrv/lsasrv.h index cbff5e2b86..174a8fb6f4 100644 --- a/dll/win32/lsasrv/lsasrv.h +++ b/dll/win32/lsasrv/lsasrv.h @@ -217,6 +217,10 @@ NTSTATUS LsapRegisterNotification( PLSA_API_MSG RequestMsg);
+VOID +LsapNotifyPolicyChange( + POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass); + /* policy.c */ NTSTATUS LsarQueryAuditLog(PLSA_DB_OBJECT PolicyObject, diff --git a/dll/win32/lsasrv/notify.c b/dll/win32/lsasrv/notify.c index 48f09c7ecf..c5233ce0bc 100644 --- a/dll/win32/lsasrv/notify.c +++ b/dll/win32/lsasrv/notify.c @@ -32,8 +32,9 @@ LsapInitNotificationList(VOID)
static PLSA_NOTIFICATION_ENTRY -LsapGetNotificationEntryByHandle( - HANDLE EventHandle) +LsapGetNotificationEntry( + HANDLE EventHandle, + POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass) { PLIST_ENTRY NotificationEntry; PLSA_NOTIFICATION_ENTRY CurrentNotification; @@ -43,7 +44,8 @@ LsapGetNotificationEntryByHandle( { CurrentNotification = CONTAINING_RECORD(NotificationEntry, LSA_NOTIFICATION_ENTRY, Entry);
- if (CurrentNotification->EventHandle == EventHandle) + if ((CurrentNotification->EventHandle == EventHandle) && + (CurrentNotification->InformationClass == InformationClass)) return CurrentNotification;
NotificationEntry = NotificationEntry->Flink; @@ -67,6 +69,7 @@ LsapRegisterNotification(
if (pRequestMsg->PolicyChangeNotify.Request.Register) { + /* Register the notification event */ pEntry = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LSA_NOTIFICATION_ENTRY)); @@ -84,12 +87,17 @@ LsapRegisterNotification( } else { - pEntry = LsapGetNotificationEntryByHandle(pRequestMsg->PolicyChangeNotify.Request.NotificationEventHandle); - if (pEntry) + /* Unregister the notification event */ + pEntry = LsapGetNotificationEntry(pRequestMsg->PolicyChangeNotify.Request.NotificationEventHandle, + pRequestMsg->PolicyChangeNotify.Request.InformationClass); + if (pEntry == NULL) { - RemoveEntryList(&pEntry->Entry); - RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry); + Status = STATUS_INVALID_HANDLE; + goto done; } + + RemoveEntryList(&pEntry->Entry); + RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry); }
done: @@ -99,4 +107,35 @@ done: return Status; }
+ +VOID +LsapNotifyPolicyChange( + POLICY_NOTIFICATION_INFORMATION_CLASS InformationClass) +{ + PLIST_ENTRY NotificationEntry; + PLSA_NOTIFICATION_ENTRY CurrentNotification; + + FIXME("LsapNotifyPolicyChange(%lu)\n", InformationClass); + + /* Acquire the notification list lock shared */ + RtlAcquireResourceShared(&NotificationListLock, TRUE); + + NotificationEntry = NotificationListHead.Flink; + while (NotificationEntry != &NotificationListHead) + { + CurrentNotification = CONTAINING_RECORD(NotificationEntry, LSA_NOTIFICATION_ENTRY, Entry); + + if (CurrentNotification->InformationClass == InformationClass) + { + FIXME("Notify event %p\n", CurrentNotification->EventHandle); + + } + + NotificationEntry = NotificationEntry->Flink; + } + + /* Release the notification list lock */ + RtlReleaseResource(&NotificationListLock); +} + /* EOF */