C:> cl /W4 /EHsc Redirection.cpp

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

Redirection.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:Redirection.exe
Redirection.obj

Source: 

#pragma comment(lib, "ole32")

#pragma comment(lib, "ShlWApi")

#pragma comment(lib, "Shell32")

 

#define _WIN32_WINNT 0x0600

#define UNICODE

 

#include <windows.h>

#include <shlobj.h>

#include <shlwapi.h>

#include <iostream>

using std::wcout;

using std::endl;

 

class auto_free_com_memory {

public:

   auto_free_com_memory(void * p) : m_p(p) {}

   ~auto_free_com_memory() {if (m_p) ::CoTaskMemFree(m_p);}

private:

   void * m_p;

};

 

int wmain() {

   wchar_t * folderPath = NULL;

 

   if FAILED(SHGetKnownFolderPath(FOLDERID_ProgramFiles, KF_FLAG_CREATE, NULL , &folderPath)) {

      wcout << L"Cannot retrieve FOLDERID_ProgramFiles known folder location." << endl;

      return -1;

   }

 

   auto_free_com_memory _fp(folderPath);

 

   // System drive root redirection

   wchar_t systemDriveRoot[] = {folderPath[0], folderPath[1], folderPath[2], L'\0'};

   WCHAR filePath[MAX_PATH];

   if (wcscpy_s(filePath, systemDriveRoot) || !PathAppend(filePath, L"UAC Redirection test.log")) {

      wcout << L"Could not build the path to a file under the system drive root folder." << endl;

      return -2;

   }

 

   wcout << L"Creating \"" << filePath << L"\"." << endl;

   HANDLE file = CreateFile(filePath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

   if (file == INVALID_HANDLE_VALUE)

      wcout << L"Could not create a file under the system drive root folder. (error " << GetLastError() << L")." << endl;

   else

      CloseHandle(file);

 

   // Program Files redirection

   if (wcscpy_s(filePath, folderPath) || !PathAppend(filePath, L"MyUACRedirection")) {

      wcout << L"Could not build the path to a file under the Program File known folder." << endl;

      return -3;

   }

 

   // Does the file folder exist?

   DWORD folderAttributes = GetFileAttributes(filePath);

   if (folderAttributes == INVALID_FILE_ATTRIBUTES || ! (folderAttributes & FILE_ATTRIBUTE_DIRECTORY))  {

      wcout << L"The folder \"" << filePath << L"\" must exist and be accessible for this test to work." << endl;

      return -4;

   }

  

   if (!PathAppend(filePath, L"MyUACRedirection.log")) {

      wcout << L"Unexpected error adding the file name to \"" << filePath << "\"."<< endl;

   }

 

   wcout << L"Creating \"" << filePath << "\"." << endl;

   file = CreateFile(filePath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  

   if (file == INVALID_HANDLE_VALUE)

      wcout << L"Could not create \"" << filePath << "\" (error " << GetLastError() << L")." << endl;

   else

      CloseHandle(file);

 

   return 0;

}