Windows 7 redirection (a.k.a. virtualization) application I use to demonstrate the effect:


C:> cl /W4 /EHsc Redirection.cpp


Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80×86
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;


}

Comments (0)