Skip to content
Snippets Groups Projects

ntdll: NtQuerySystemInformation(SystemProcessorPerformanceInformation) fix return value

Open Dāvis Mosāns (davispuh) requested to merge davispuh/wine:sysprocperf into master

Make return value to work like in Windows where given size must match for STATUS_SUCCESS result.

For more context/background info see !4832 (closed)

Merge request reports

Loading
Loading

Activity

Filter activity
  • Approvals
  • Assignees & reviewers
  • Comments (from bots)
  • Comments (from users)
  • Commits & branches
  • Edits
  • Labels
  • Lock status
  • Mentions
  • Merge request status
  • Tracking
    • It copies but then gives STATUS_INFO_LENGTH_MISMATCH? And returning STATUS_ACCESS_VIOLATION has priority over STATUS_INFO_LENGTH_MISMATCH? Not saying you're wrong, just wondering. Would you mind adding tests for that?

    • This is current behavior on Windows 10 22H2:

       NULL buffer and size = 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
       NULL buffer and size > 0 -> STATUS_ACCESS_VIOLATION,     ReturnLength=0
      valid buffer and size = 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size > 0 -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size <    1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size =    1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS,              ReturnLength=   1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size >    1*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size =    2*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS,              ReturnLength=   2*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size < cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size = cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS,              ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
      valid buffer and size > cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_INFO_LENGTH_MISMATCH, ReturnLength=cpus*sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)

      Wine has few differences regarding this but here this MR fixes only single case

      size % sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) -> STATUS_SUCCESS

      Handling of STATUS_ACCESS_VIOLATION and ReturnLength is not changed.

      And regarding test, actually Wine already has such test, see info.c#752

      ok( status == STATUS_SUCCESS || status == STATUS_INFO_LENGTH_MISMATCH /* vista */,
              "Expected STATUS_SUCCESS or STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
      

      It looks like before Vista it returned STATUS_SUCCESS which is current Wine implementation, but since Vista it started to return STATUS_INFO_LENGTH_MISMATCH instead

    • It looks like before Vista it returned STATUS_SUCCESS which is current Wine implementation, but since Vista it started to return STATUS_INFO_LENGTH_MISMATCH instead

      Is there an actual app that depends on this?

    • We didn't know so we just tried this but in the end it didn't make any difference.

      So no I don't know any such app. And it's such an edge case that I guess only way for it to matter is if someone compares GetVersion() with result (eg. to detect poor sandbox etc) but that seems incredibly unlikely and there's probably hundreds of other functions to compare aswell.

    • Please register or sign in to reply
  • added 187 commits

    • 34e296a8...35ac0e7a - 186 commits from branch wine:master
    • 6cbfc007 - ntdll: NtQuerySystemInformation(SystemProcessorPerformanceInformation) fix return value

    Compare with previous version

Please register or sign in to reply
Loading