VOID RegReadApcProcedure( PVOID RegReadApcContext, PIO_STATUS_BLOCK IoStatus ) { UNICODE_STRING ValueString; LONG Status; BYTE Buf[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD)]; DWORD cbSize; ULONG l; RtlInitUnicodeString(&ValueString, L"Win32PrioritySeparation"); Status = NtQueryValueKey(hKeyPriority, &ValueString, KeyValuePartialInformation, (PKEY_VALUE_PARTIAL_INFORMATION)Buf, sizeof(Buf), &cbSize); if (NT_SUCCESS(Status)) { l = *((PDWORD)((PKEY_VALUE_PARTIAL_INFORMATION)Buf)->Data); } else l = 1; // last resort default if ( l <= 2 ) { CsrSetForegroundPriority((PCSR_PROCESS)(l)); } NtNotifyChangeKey( hKeyPriority, NULL, (PIO_APC_ROUTINE)RegReadApcProcedure, NULL, &IoStatusRegChange, REG_NOTIFY_CHANGE_LAST_SET, FALSE, &RegChangeBuffer, sizeof(RegChangeBuffer), TRUE ); }
VOID BaseSrvNlsUpdateRegistryCache( PVOID ApcContext, PIO_STATUS_BLOCK pIoStatusBlock) { ULONG rc = 0L; /* return code */ if (hCPanelIntlKeyRead != NULL) { /* * Update the cache information. */ NlsUpdateCacheInfo(); /* * Call NtNotifyChangeKey. */ rc = NtNotifyChangeKey( hCPanelIntlKeyRead, NULL, (PIO_APC_ROUTINE)BaseSrvNlsUpdateRegistryCache, NULL, &IoStatusBlock, REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME, FALSE, &NlsChangeBuffer, sizeof(NlsChangeBuffer), TRUE ); #ifdef DBG /* * Check for error from NtNotifyChangeKey. */ if (!NT_SUCCESS( rc )) { KdPrint(("NLSAPI (BaseSrv): Could NOT Set Notification of Control Panel International Registry Key - %lx.\n", rc)); } #endif } }
void main( int argc, char *argv[] ) { NTSTATUS status; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE BaseHandle; HANDLE EventHandle; PIO_APC_ROUTINE ApcRoutine; // // Process args // KeyName.MaximumLength = WORK_SIZE; KeyName.Length = 0L; KeyName.Buffer = &(workbuffer[0]); processargs(argc, argv); // // Set up and open KeyPath // printf("rtnotify: starting\n"); InitializeObjectAttributes( &ObjectAttributes, &KeyName, 0, (HANDLE)NULL, NULL ); ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE; status = NtOpenKey( &BaseHandle, KEY_NOTIFY, &ObjectAttributes ); if (!NT_SUCCESS(status)) { printf("rtnotify: t0: %08lx\n", status); exit(1); } EventHandle = (HANDLE)NULL; if (UseEvent == TRUE) { status = NtCreateEvent( &EventHandle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, NULL, NotificationEvent, FALSE ); if (!NT_SUCCESS(status)) { printf("rtnotify: t1: %08lx\n", status); exit(1); } } ApcRoutine = NULL; if (UseApc) { ApcRoutine = ApcTest; } printf("rtnotify:\n"); printf("\tUseEvent = %08lx\n", UseEvent); printf("\tApcRoutine = %08lx\n", ApcRoutine); printf("\tHold = %08lx\n", Hold); printf("\tFilter = %08lx\n", Filter); printf("\tWatchTree = %08lx\n", WatchTree); while (TRUE) { ApcSeen = FALSE; printf("\nCallCount = %dt\n", CallCount); CallCount++; status = NtNotifyChangeKey( BaseHandle, EventHandle, ApcRoutine, (PVOID)1992, // arbitrary context value &RtIoStatusBlock, Filter, WatchTree, NULL, 0, ! Hold ); exit(0); if ( ! NT_SUCCESS(status)) { printf("rtnotify: t2: %08lx\n", status); exit(1); } if (Hold) { printf("rtnotify: Synchronous Status = %08lx\n", RtIoStatusBlock.Status); } if (UseEvent) { status = NtWaitForSingleObject( EventHandle, TRUE, NULL ); if (!NT_SUCCESS(status)) { printf("rtnotify: t3: status = %08lx\n", status); exit(1); } printf("rtnotify: Event Status = %08lx\n", RtIoStatusBlock.Status); } if (UseApc) { while ((volatile)ApcSeen == FALSE) { NtTestAlert(); } } } NtClose(BaseHandle); exit(0); }