Всем привет. Хочется определить (в драйвере) по file_object, является ли файл папкой рабочего стола. (как например "C:\Documents and Settings\genesis.DEV\Рабочий стол"). Одна из версий - смотреть в реестре, в HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop, но он иногда бывает и пустой... Подскажите плиз, может есть какой то другой путь?
неужели пустой бывает? ) я так понял необходимо для начала определить имя пакпи рабочего стола с учетом языковой локализаии, в этом проблема? ну имя пользователя не проблема опледелить а имя папки рабочего стола, вариант подсчета кол-ва ярлыков *.lnk в поддиректориях 1-го уровня (кроме Recent) директории пользователя не пойдет? )
еще вариант поиск в HKEY_CLASSES_ROOT SID-в с InProcServer32 == shell32.dll и с подключем shellex\ExtShellFolderViews\<SOME_SID>, PersistMoniker ~= "Desktop.htt", по умолчанию - имя рабочего стола в вот грамотный способ, в юзермоде определить SHGetSpecialFolderLocation(CSIDL_DESKTOPDIRECTORY) и передать дайверу Код (Text): #include <windows.h> #include <Shlobj.h> #include <Shlwapi.h> #pragma comment(lib,"ShLwApi.Lib") HRESULT hres; IMalloc *pShellMalloc = NULL; // A pointer to the shell's IMalloc interface IShellFolder *psfParent; // A pointer to the parent folder object's IShellFolder interface. LPITEMIDLIST pidlItem = NULL; // The item's PIDL. LPITEMIDLIST pidlRelative = NULL; // The item's PIDL relative to the parent folder. STRRET str; // The structure for strings returned from IShellFolder. CHAR szDisplayName[MAX_PATH]= ""; // The display name's string. CHAR szPath[MAX_PATH] = ""; // The path. int main(int argc, char* argv[]) { hres = SHGetMalloc(&pShellMalloc); if(SUCCEEDED(hres)) { hres = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidlItem); if (SUCCEEDED(hres)) { hres = SHBindToParent(pidlItem, IID_IShellFolder, (void**)&psfParent, (LPCITEMIDLIST*)&pidlRelative); if (SUCCEEDED(hres)) { // Retrieve the display name memset(&str, 0, sizeof(str)); hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &str); if(SUCCEEDED(hres)) StrRetToBuf(&str, pidlItem, szDisplayName, ARRAYSIZE(szDisplayName)); // Retrieve the path memset(&str, 0, sizeof(str)); hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL | SHGDN_FORPARSING, &str); if(SUCCEEDED(hres)) StrRetToBuf(&str, pidlItem, szPath, ARRAYSIZE(szPath)); psfParent->Release(); if (pidlRelative) pShellMalloc->Free(pidlRelative); } } if(pidlItem) pShellMalloc->Free(pidlItem); pShellMalloc->Release(); } MessageBox(0,szPath,"szPath",0); MessageBox(0,szDisplayName,"szDisplayName",0); return 0; }