fopen_s returns error code 2 with system account and win 32 but works fine on winx64 (c++)

441 Views Asked by At

I have a cpp program that uses fopen_s to open and read a file created under the directory C:\Windows\System32\config\systemprofile\AppData\Roaming.

My program needs to be compatible with winx64 and win32.

When I run this program with a system account (run using PSTools\PSExec -i -s C:\windows\system32\cmd.exe) and the Win32 compiled version of the program, fopen_s() on any file inside "C:\Windows\System32\config\systemprofile\AppData\Roaming" returns an error code 2, even though the file is present. However, when I run the x64 compiled version of the same program, it works fine and fopen_s() is able to find and open the same file.

I am sure there are no mistakes as far as passing a valid filename to fopen_s() and I have verified this.

I make sure that the int variable that stores the return value from fopen_s() is set to 0 every time before calling fopen_s(). I am calling fopen_s() in "r" mode.

Also, elsewhere in the same program I am able to create files under the same directory.

I am using VS2019 and cpp +11 to compile my program. My system is running windows 10 (64-bit) on an x64 processor (Intel(R) Xeon(R) Gold 6136)

Why would a win32 application fail to read a file created under "C:\Windows\System32\config\systemprofile\AppData\Roaming" with a system account while the x64 version of the same application works fine?

Code snippet:

int FileOpenFunc(FILE ** ppFile, std::string sFilename, std::string sOpenMode)
{
    int errOpen = 0;
#ifdef _WIN32
    errOpen = fopen_s(ppFile, sFilename.c_str(), sOpenMode.c_str());
#else
    *ppFile = fopen(sFilename.c_str(), sOpenMode.c_str());
    errOpen = errno;
#endif
    return errOpen;
}

void func()
{
    std::string sFileName = "C:\\Windows\\System32\\config\\systemprofile\\AppData\\Roaming\\Check\\sample.txt";
    int errFopenErrNo = 0;
    FILE* fp = NULL;
    errFopenErrNo = FileOpenFunc(&fp, sFileName, "r");

    if (fp!= NULL)
    {
        //do something
    }
    else
    {
        //do something else
    }
}
0

There are 0 best solutions below