I have a function:
VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
{
OSVERSIONINFO osver;
ZeroMemory(&osver, sizeof(OSVERSIONINFO));
the problem is there:
DWORD major;
DWORD minor;
DWORD build;
GetOSVersion(&major, &minor, &build);
Fix:
VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
{
OSVERSIONINFO osver = {};
osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osver);
if(major)
*major = osver.dwMajorVersion;
if(minor)
*minor = osver.dwMinorVersion;
if(build)
*build = osver.dwBuildNumber;
}
DWORD major = 0;
DWORD minor = 0;
DWORD build = 0;
GetOSVersion(&major, &minor, &build);
PDWORD is pointer to DWORD. All three parameters are output parameters. In C/C++, it's a common usage: if you want to return more then one value from a function, you need pass pointer (or reference too in case of c++) to a variable:
int var = 0;
if(some_function_that_can_fail_and_write_result(&var))
;//do something
In your case you are passing uninitialized pointer to a function by value. It's the same as:
void foo(int parameter);
// ...
int a;
foo(a);
You have a lot of ways:
Pass uninitialized pointer by reference:
VOID GetOSVersion(PDWORD& major, PDWORD&, PDWORD&)
{
//...
major = new DWORD(osver.dwMajorVersion);
}
// usage:
PDWORD major;
GetOSVersion(major, ....);
//...
delete major;
Pass all parameters by reference:
VOID GetOSVersion(DWORD& major, DWORD&, DWORD&)
{
//...
major = osver.dwMajorVersion;
}
// usage:
DWORD major = 0;
GetOSVersion(major, ....);
Use your version of GetOSVersion(), but with the fix in this answer on the beginning