开发者

GetSystemInfo always returns 0 for dwAllocationGranularity on Win7 from Win Service

开发者 https://www.devze.com 2023-04-06 20:26 出处:网络
I\'m attempting to get the allocation granularity size using GetSystemInfo() from a C# 3.5 windows service application on Windows 7. However the SYSTEM_INFO struct always has 0 in dwAllocationGranular

I'm attempting to get the allocation granularity size using GetSystemInfo() from a C# 3.5 windows service application on Windows 7. However the SYSTEM_INFO struct always has 0 in dwAllocationGranularity when it is returned from the call (other fields have data filled in as expected)

The SYSTEM_INFO struct looks like this with PROCESSOR_ARCHITECTURE and PROCESSOR_TYPE enums omitted for brevity:

public struct SYSTEM_INFO
{
    public PROCESSOR_ARCHITECTURE wProcessorArchitecture;
    public ushort wReserved;
    public uint dwPageSize;
    public int lpMinimumApplicationAddress;
    public int lpMaximumApplicationAddress;
    public uint dwActiveProcessorMask;
    public uint dwNumberOfProcessors;
    public PROCESSOR_TYPE dwProcessorType;
    public uint dwAllocationGranularity;
    public ushort wProcessorLevel;
    public ushort wProcessorRevision;
}

The extern call to GetSystemInfo is this:

[DllImport("kernel32")]
public static extern void GetSystemInfo(ref SYSTEM_INFO SystemInfo); 

The calling code is like this:

SYSTEM_INFO sysInfo = new SYSTEM_INFO();
GetSystemInfo(ref sysInfo);

The Output SYS_INFO struct after running code is:

dwActiveProcessorMask        4294901759
dwAllocationGranularity      0
dwNumberOfProcessors         2047
dwPageSize                   4096
dwProcessorType              15
lpMaximumApplicationAddress  0
lpMinimumApplicationAddress  65536
wProcessorArchitecture       9
wProcessorLevel              4
wProcessorRevision           0
wReserved                    0

Any ideas what I'm missing or suggestions on other ways to get this info (I don't want to hard code to 64Kb JIC it i开发者_开发百科s changed at some point)? Thanks.


You also don't have 2047 processors :) The declaration is wrong, it will fail in 64-bit mode. lpMin/MaxApplicationAddress and dwActiveProcessorMask are IntPtr.

0

精彩评论

暂无评论...
验证码 换一张
取 消