Как определить является ли file_object файлом десктопа?

Тема в разделе "WASM.NT.KERNEL", создана пользователем genesis, 22 дек 2008.

  1. genesis

    genesis New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    43
    Всем привет.

    Хочется определить (в драйвере) по file_object, является ли файл папкой рабочего стола. (как например "C:\Documents and Settings\genesis.DEV\Рабочий стол").

    Одна из версий - смотреть в реестре, в HKEY_USERS\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop, но он иногда бывает и пустой...

    Подскажите плиз, может есть какой то другой путь?
     
  2. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    неужели пустой бывает? )
    я так понял необходимо для начала определить имя пакпи рабочего стола с учетом языковой локализаии, в этом проблема?
    ну имя пользователя не проблема опледелить
    а имя папки рабочего стола, вариант подсчета кол-ва ярлыков *.lnk в поддиректориях 1-го уровня (кроме Recent) директории пользователя не пойдет? )
     
  3. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    еще вариант поиск в HKEY_CLASSES_ROOT SID-в с InProcServer32 == shell32.dll и с подключем
    shellex\ExtShellFolderViews\<SOME_SID>, PersistMoniker ~= "Desktop.htt", по умолчанию - имя рабочего стола

    в вот грамотный способ, в юзермоде определить SHGetSpecialFolderLocation(CSIDL_DESKTOPDIRECTORY) и передать дайверу

    Код (Text):
    1. #include <windows.h>
    2. #include <Shlobj.h>
    3. #include <Shlwapi.h>
    4.  
    5. #pragma comment(lib,"ShLwApi.Lib")
    6.  
    7.     HRESULT hres;
    8.     IMalloc *pShellMalloc = NULL;         // A pointer to the shell's IMalloc interface
    9.     IShellFolder *psfParent;              // A pointer to the parent folder object's IShellFolder interface.
    10.     LPITEMIDLIST pidlItem = NULL;         // The item's PIDL.
    11.     LPITEMIDLIST pidlRelative = NULL;     // The item's PIDL relative to the parent folder.
    12.     STRRET str;                           // The structure for strings returned from IShellFolder.
    13.     CHAR szDisplayName[MAX_PATH]= "";     // The display name's string.
    14.     CHAR szPath[MAX_PATH] = "";           // The path.
    15.  
    16.  
    17. int main(int argc, char* argv[])
    18. {
    19.     hres = SHGetMalloc(&pShellMalloc);
    20.     if(SUCCEEDED(hres))
    21.     {
    22.         hres = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidlItem);
    23.         if (SUCCEEDED(hres))
    24.         {
    25.             hres = SHBindToParent(pidlItem, IID_IShellFolder, (void**)&psfParent, (LPCITEMIDLIST*)&pidlRelative);
    26.             if (SUCCEEDED(hres))
    27.             {
    28.                 // Retrieve the display name
    29.                 memset(&str, 0, sizeof(str));
    30.  
    31.                 hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &str);
    32.                 if(SUCCEEDED(hres)) StrRetToBuf(&str, pidlItem, szDisplayName, ARRAYSIZE(szDisplayName));
    33.    
    34.                 // Retrieve the path
    35.                 memset(&str, 0, sizeof(str));
    36.                 hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL | SHGDN_FORPARSING, &str);
    37.  
    38.                 if(SUCCEEDED(hres)) StrRetToBuf(&str, pidlItem, szPath, ARRAYSIZE(szPath));
    39.  
    40.                 psfParent->Release();
    41.  
    42.                 if (pidlRelative) pShellMalloc->Free(pidlRelative);
    43.             }
    44.         }
    45.  
    46.         if(pidlItem) pShellMalloc->Free(pidlItem);
    47.         pShellMalloc->Release();
    48.     }  
    49.  
    50.     MessageBox(0,szPath,"szPath",0);
    51.     MessageBox(0,szDisplayName,"szDisplayName",0);
    52.  
    53.     return 0;
    54. }