X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Fex%2Fsysinfo.c;h=66975c0e8c3aa98672acf707d24b2b49f3da3412;hp=007543fcd113fc4391325cb9e62bf95883a56f40;hb=0b3c4c8734bd6e18f5a2143600557575584f84b5;hpb=564ff01f3d17d59e400ca161e0ae5b467b577934 diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 007543fcd11..66975c0e8c3 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -2168,31 +2168,47 @@ SSI_DEF(SystemLoadGdiDriverInSystemSpaceInformation) /* Class 55 - NUMA processor information */ QSI_DEF(SystemNumaProcessorMap) { + ULONG MaxEntries, Node; PSYSTEM_NUMA_INFORMATION NumaInformation = (PSYSTEM_NUMA_INFORMATION)Buffer; + /* Validate input size */ if (Size < sizeof(ULONG)) { return STATUS_INFO_LENGTH_MISMATCH; } -#if 1 // Partial & incomplete implementation just to let GetNumaHighestNodeNumber() work - /* In case of a partial query, just return number of nodes and stop here */ - if (Size < sizeof(SYSTEM_NUMA_INFORMATION)) + /* Return highest node */ + NumaInformation->HighestNodeNumber = KeNumberNodes - 1; + + /* Compute how much entries we will be able to put in output structure */ + MaxEntries = (Size - FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask)) / sizeof(ULONGLONG); + /* Make sure we don't overflow KeNodeBlock */ + if (MaxEntries > KeNumberNodes) { - NumaInformation->HighestNodeNumber = KeNumberNodes - 1; - *ReqSize = sizeof(ULONG); - return STATUS_SUCCESS; + MaxEntries = KeNumberNodes; + } + + /* If we have entries to write, and room for it */ + if (Size >= FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask) && + MaxEntries != 0) + { + /* Already set size we return */ + *ReqSize = FIELD_OFFSET(SYSTEM_NUMA_INFORMATION, ActiveProcessorsAffinityMask) + + MaxEntries * sizeof(ULONGLONG); + + /* For each node, return processor mask */ + for (Node = 0; Node < MaxEntries; ++Node) + { + NumaInformation->ActiveProcessorsAffinityMask[Node] = KeNodeBlock[Node]->ProcessorMask; + } } else { - DPRINT1("NtQuerySystemInformation - SystemNumaProcessorMap not implemented\n"); - return STATUS_NOT_IMPLEMENTED; + /* We only returned highest node number */ + *ReqSize = sizeof(ULONG); } -#else - /* FIXME */ - DPRINT1("NtQuerySystemInformation - SystemNumaProcessorMap not implemented\n"); - return STATUS_NOT_IMPLEMENTED; -#endif + + return STATUS_SUCCESS; }