inline void get_shared_documents_folder(std::string &s)
{
   s.clear();
   void *hAdvapi = load_library("Advapi32.dll");
   if (hAdvapi){
      library_unloader unloader(hAdvapi);
      //  Pointer to function RegOpenKeyA
      RegOpenKeyEx_t pRegOpenKey =
         (RegOpenKeyEx_t)get_proc_address(hAdvapi, "RegOpenKeyExA");
      if (pRegOpenKey){
         //  Pointer to function RegCloseKey
         RegCloseKey_t pRegCloseKey =
            (RegCloseKey_t)get_proc_address(hAdvapi, "RegCloseKey");
         if (pRegCloseKey){
            //  Pointer to function RegQueryValueA
            RegQueryValueEx_t pRegQueryValue =
               (RegQueryValueEx_t)get_proc_address(hAdvapi, "RegQueryValueExA");
            if (pRegQueryValue){
               //Open the key
               void *key;
               if ((*pRegOpenKey)( hkey_local_machine
                                 , "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
                                 , 0
                                 , key_query_value
                                 , &key) == 0){
                  reg_closer key_closer(pRegCloseKey, key);

                  //Obtain the value
                  unsigned long size;
                  unsigned long type;
                  const char *const reg_value = "Common AppData";
                  long err = (*pRegQueryValue)( key, reg_value, 0, &type, 0, &size);
                  if(!err){
                     //Size includes terminating NULL
                     s.resize(size);
                     err = (*pRegQueryValue)( key, reg_value, 0, &type, (unsigned char*)(&s[0]), &size);
                     if(!err)
                        s.erase(s.end()-1);
                     (void)err;
                  }
               }
            }
         }
      }
   }
}
//pszFilename must have room for at least MaxPath+1 characters
inline bool get_file_name_from_handle_function
   (void * hFile, wchar_t *pszFilename, std::size_t length, std::size_t &out_length) 
{
   if(length <= MaxPath){
      return false;
   }

   void *hiPSAPI = load_library("PSAPI.DLL");
   if (0 == hiPSAPI)
      return 0;

   library_unloader unloader(hiPSAPI);

   //  Pointer to function getMappedFileName() in PSAPI.DLL
   GetMappedFileName_t pfGMFN =
      (GetMappedFileName_t)get_proc_address(hiPSAPI, "GetMappedFileNameW");
   if (! pfGMFN){
      return 0;      //  Failed: unexpected error
   }

   bool bSuccess = false;

   // Create a file mapping object.
   void * hFileMap = create_file_mapping(hFile, page_readonly, 0, 1, 0);
   if(hFileMap)
   {
      // Create a file mapping to get the file name.
      void* pMem = map_view_of_file_ex(hFileMap, file_map_read, 0, 0, 1, 0);

      if (pMem){
         out_length = pfGMFN(get_current_process(), pMem, pszFilename, MaxPath);
         if(out_length){
            bSuccess = true;
         } 
         unmap_view_of_file(pMem);
      }
      close_handle(hFileMap);
   }

   return(bSuccess);
}
void
ObjectGridUnloader::Unload(GridType &grid)
{
    TypeContainerVisitor<ObjectGridUnloader, GridTypeMapContainer > unloader(*this);
    grid.Visit(unloader);
}
void 
ObjectGridUnloader::Unload(GridType &grid)
{
    TypeContainerVisitor<ObjectGridUnloader, TypeMapContainer<AllObjectTypes> > unloader(*this);
    grid.VisitGridObjects(unloader);
}
Exemple #5
0
/**
 * Process a callout to package loader function
 */
void LibraryUnloaderDispatcher::run()
{
    RexxThreadContext *context = activity->getThreadContext();

    unloader(context);
}