путь к корзине Windows?

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 22 апр 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    как получить путь к корзине Windows

    invoke SHGetFolderPath,0,CSIDL_BITBUCKET,0,0,ADDR pathRecycleBin не работает, хотя пути с другими значениями CSIDL выдаёт

    желательно с примером
     
  2. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Да, хороший вопрос :)
    Мне удалось только получить ITEMIDLIST, а как получить из него путь в файловой системе - хз.
    Код (Text):
    1. LPITEMIDLIST id;
    2. HRESULT res = SHGetFolderLocation (0, CSIDL_BITBUCKET, 0, 0, &id);
    P.S. А функция SHGetFolderPath вообще не поддерживает параметр CSIDL_BITBUCKET.
     
  3. Tector

    Tector New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2007
    Сообщения:
    2
    А почему не "C:\Recycler"?
     
  4. ShadoWich

    ShadoWich New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2007
    Сообщения:
    35
    Tector
    потому что система может стоять не на с, да и для разных версий винды - по разному
     
  5. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    SHGetSpecialFolderLocation/SHGetSpecialFolderPath
     
  6. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Хотя бы попробовал сам, перед тем как сообщение писать :)

    SHGetSpecialFolderPath возвращает FALSE, да и в MSDN написано "If a virtual folder is specified, this function will fail".

    SHGetSpecialFolderLocation вроде работает, возвращает какое-то LPITEMIDLIST, да вот только преобразовать его в файловый путь не удается: SHGetPathFromIDList возвращает FALSE.

    Так что вопрос остается открытым.
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    http://www.thescripts.com/forum/thread238757.html
     
  8. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    ну как-нибудь же можно определить путь к файлу удалённому в корзину
     
  9. kkrutoy

    kkrutoy New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    44
    Адрес:
    Владивосток
    Ты б еще к нортоновскому Unerase определял...

    Сканируй все диски на наличие каталогов Recycled, ищи в нем desktop.ini
    проверяй наличие в нем
    [.ShellClassInfo]
    CLSID={645FF040-5081-101B-9F08-00AA002F954E}

    Если это есть, значит точно корзина.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MSDN.
    Код (Text):
    1. IMalloc * pShellMalloc = NULL;        // A pointer to the shell's IMalloc interface
    2. IShellFolder *psfParent;              // A pointer to the parent folder object's IShellFolder interface.
    3. LPITEMIDLIST pidlItem = NULL;         // The item's PIDL.
    4. LPITEMIDLIST pidlRelative = NULL;     // The item's PIDL relative to the parent folder.
    5. STRRET str;                           // The structure for strings returned from IShellFolder.
    6. WCHAR szDisplayName[MAX_PATH]= L"";   // The display name's string for Favorites
    7. WCHAR szPath[MAX_PATH] = L"";         // The path for Favorites.
    8.  
    9. HRESULT hres = SHGetMalloc(&pShellMalloc);
    10. if (FAILED(hres))
    11. {
    12.     return hres;
    13. }
    14. hres = SHGetSpecialFolderLocation(NULL,
    15.                                   CSIDL_BITBUCKET,
    16.                                   &pidlItem);
    17. if (SUCCEEDED(hres))
    18. {
    19.     hres = SHBindToParent(pidlItem,
    20.                           IID_IShellFolder,
    21.                           (void**)&psfParent,
    22.                           (LPCITEMIDLIST*)&pidlRelative);
    23.     if (SUCCEEDED(hres))
    24.     {
    25.         // Retrieve the display name
    26.         memset(&str, 0, sizeof(str));
    27.         hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &str);
    28.         if (SUCCEEDED(hres))
    29.         {
    30.             StrRetToBuf(&str, pidlItem, szDisplayName, ARRAYSIZE(szDisplayName));
    31.         }
    32.         // Retrieve the path
    33.         memset(&str, 0, sizeof(str));
    34.         hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL | SHGDN_FORPARSING, &str);
    35.         if (SUCCEEDED(hres))
    36.         {
    37.             StrRetToBuf(&str, pidlItem, szPath, ARRAYSIZE(szPath));
    38.         }
    39.         psfParent->Release();
    40.     }
    41. }
    42.  
    43. // Clean up allocated memory
    44. if (pidlItem)
    45. {
    46.     pShellMalloc->Free(pidlItem);
    47. }
    48. if (pidlRelative)
    49. {
    50.     pShellMalloc->Free(pidlRelative);
    51. }
    52. pShellMalloc->Release();
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  12. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Можно по подробнее про следующие функции (про аргументы)? В MSDN непонятно.

    SHGetSpecialFolderLocation(NULL,CSIDL_BITBUCKET,&pidlItem)

    SHBindToParent(pidlItem,IID_IShellFolder,(void**)&psfParent,(LPCITEMIDLIST*)&pidlRelative)
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    В MSDN непонятно
    В общих чертах.
    Первая функция в последнем параметре возвращает абсолютный (относительно рабочего стола) идентификатор для специальной папки.
    Вторая для идентификатора, указанного в первом параметре, возвращает в третьем параметре указатель на интерфейс (вид во втором параметре, в данном случае IShellFolder) для родителя, а в четвертом параметре возвращается относительный (относительно родителя) идентификатор. Делается это в надежде, что родителя можно попросить информацию о детях, т.е. использовать его методы, в данном случае GetDisplayNameOf.

    #1 как получить путь к корзине Windows
    #8 ну как-нибудь же можно определить путь к файлу удалённому в корзину
    Пояснишь что, а главное, зачем тебе это надо?
    Может быть ты хочешь посмотреть список удаленного в корзину и посмотреть какие-либо свойства элементов этого списка?
     
  14. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Надо удалить файл из корзины. Без SHEmptyRecycleBin.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    удалить файл из корзины
    Теоретически так
    Код (Text):
    1. #define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
    2.  
    3.   IShellFolder *psfdt; // desktop
    4.   IShellFolder *psfrb; // recyclebin
    5.   IEnumIDList  *peidl;
    6.   LPITEMIDLIST  piidl;
    7.   LPITEMIDLIST  pidlrb;
    8.   LPMALLOC      pm;
    9.  
    10.   CoInitialize(NULL);
    11.  
    12.   SHGetMalloc(&pm);
    13.  
    14. // получить доступ к корзине через IShellFolder
    15.   SHGetDesktopFolder(&psfdt);
    16.   SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidlrb);
    17.   psfdt->lpVtbl->BindToObject(psfdt, pidlrb, NULL,
    18.                    &IID_IShellFolder, (LPVOID *) &psfrb);
    19.  
    20. // получить доступ к списку элементов в корзине
    21.   psfrb->lpVtbl->EnumObjects(psfrb, NULL,
    22.                    SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &peidl);
    23.  
    24. // организовать цикл просмотра элементов
    25.   while (NOERROR == peidl->lpVtbl->Next(peidl, 1, &piidl, NULL))
    26.   {
    27.     STRRET str;
    28.     TCHAR sz0[ 1024 ]; // Original
    29.     TCHAR sz1[ 1024 ]; // RecycleBin
    30.  
    31.   // получить имя до удаления
    32.     sz0[ 0 ] = TEXT('\0');
    33.     psfrb->lpVtbl->GetDisplayNameOf(psfrb, piidl, SHGDN_NORMAL, &str);
    34.     StrRetToBuf(&str, piidl, sz0, ARRAYSIZE(sz0));
    35.     if (STRRET_WSTR == str.uType)
    36.       pm->lpVtbl->Free(pm, str.pOleStr);
    37.  
    38.   // получить имя в корзине
    39.     sz1[ 0 ] = TEXT('\0');
    40.     psfrb->lpVtbl->GetDisplayNameOf(psfrb, piidl, SHGDN_FORPARSING, &str);
    41.     StrRetToBuf(&str, piidl, sz1, ARRAYSIZE(sz1));
    42.     if (STRRET_WSTR == str.uType)
    43.       pm->lpVtbl->Free(pm, str.pOleStr);
    44.  
    45.   // к этому моменту:
    46.   //  sz0 - имя файла до удаления, вдруг пригодится
    47.   //  sz1 - имя файла в корзине, для SHFileOperation
    48.   //  piidl - идентификатор элемента в корзине,
    49.   //          для получения контекстного меню
    50.  
    51.   //
    52.   // метод с использованием SHFileOperation,
    53.   //  не уверен, что этот метод позволяет оболочке корректно
    54.   //  синхронизировать базу удаленных элементов (файл info2)
    55.   //  с собственно удаленными элементами, лежащими в корзине,
    56.   //  у меня получилось удалить когда программа выполнялась
    57.   //  под OllyDbg, иначе SHFileOperation завершалась с ошибкой
    58.   //
    59.     SHFILEOPSTRUCT fos;
    60.  
    61.     RtlZeroMemory(&fos, sizeof(fos));
    62.     fos.wFunc  = FO_DELETE;
    63.     fos.pFrom  = sz1;
    64.     fos.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
    65.     SHFileOperation(&fos);
    66.  
    67.   //
    68.   // метод через контекстное меню, то самое, которое у
    69.   //  элемента корзины вызывается правой кнопкой, по идее
    70.   //  правильный метод, однако не знаю как отнесется
    71.   //  IEnumIDList к тому, что удален очередной элемент,
    72.   //  у меня получилось удалить только файл в корзине на
    73.   //  диске Ц (в этой корзине есть папка пользователя), при
    74.   //  этом появлялось окошко запроса на подтверждения
    75.   //  удаления файла из корзины
    76.   //
    77.     IContextMenu *pcm;
    78.     CMINVOKECOMMANDINFO cmiki;
    79.  
    80.   // получить контекстное меню для очередного элемента
    81.     psfrb->lpVtbl->GetUIObjectOf(psfrb, NULL, 1, &piidl,
    82.                      &IID_IContextMenu, NULL, (LPVOID *) &pcm);
    83.  
    84.   //
    85.   // Через контекстное меню "правильный" метод
    86.   //
    87.     HMENU hMenu = CreatePopupMenu();
    88.     UINT off = 0;
    89.   // выгрузить контекстное меню в свое
    90.     pCtxMenu->lpVtbl->QueryContextMenu(pcm, hMenu, 0, off, (UINT) -1, CMF_NORMAL);
    91.     UINT ui;
    92.     UINT uiDelete = (UINT)-1;
    93.     UINT uiCount = GetMenuItemCount(hMenu);
    94.   // перебирать элементы своего меню для получения IDM_xxx
    95.   // которые будем передавать в контекстное меню для получения
    96.   // language-independent command name
    97.     for (ui = 0; ui < uiCount; ui++)
    98.     {
    99.       TCHAR sz[ 1024 ];
    100.       if (0 != GetMenuString(hMenu, ui, sz, ARRAYSIZE(sz), MF_BYPOSITION))
    101.       {
    102.         UINT uiID = GetMenuItemID(hMenu, ui);
    103.         if (((UINT)-1 != uiID) && (0 != uiID))
    104.         {
    105.           pcm->lpVtbl->GetCommandString(pcm, uiID - off, GCS_VERB, NULL, sz, ARRAYSIZE(sz));
    106.           if (0 == lstrcmpi(sz, TEXT("delete")))
    107.           {
    108.             uiDelete = uiID - off;
    109.             break;
    110.           }
    111.         }
    112.       }
    113.     }
    114.     if ((UINT)-1 != uiDelete)
    115.     {
    116.       RtlZeroMemory(&cmiki, sizeof(cmiki));
    117.       cmiki.cbSize = sizeof(cmiki);
    118.       cmiki.fMask  = CMIC_MASK_FLAG_NO_UI;
    119.       cmiki.lpVerb = MAKEINTRESOURCE(uiDelete);
    120.       cmiki.nShow  = SW_HIDE;
    121.       pcm->lpVtbl->InvokeCommand(pcm, &cmiki);
    122.       SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_FLUSH | SHCNF_IDLIST, pidlrb, NULL);
    123.     }
    124.  
    125.   //
    126.   // Через контекстное меню метод "в лоб"
    127.   //
    128.     RtlZeroMemory(&cmiki, sizeof(cmiki));
    129.     cmiki.cbSize = sizeof(cmiki);
    130.     cmiki.fMask  = CMIC_MASK_FLAG_NO_UI;
    131.     cmiki.lpVerb = "delete";
    132.     cmiki.nShow  = SW_HIDE;
    133.     pcm->lpVtbl->InvokeCommand(pcm, &cmiki);
    134.     SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_FLUSH | SHCNF_IDLIST, pidlrb, NULL);
    135.  
    136.   // освободить контекстное меню
    137.     pcm->lpVtbl->Release(pcm);
    138.  
    139.  
    140.   // освободить очередной элемент корзины
    141.     pm->lpVtbl->Free(pm, piidl);
    142.   }
    143.  
    144. // почистить за собой
    145.   peidl->lpVtbl->Release(peidl);
    146.   psfrb->lpVtbl->Release(psfrb);
    147.   psfdt->lpVtbl->Release(psfdt);
    148.   pm->lpVtbl->Free(pm, pidlrb);
    149.   CoUninitialize();
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Спасибо за разъяснения. Но я плохо понимаю си. Поэтому, если можно, ещё раз первый метод, только на ассемблере.
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    ещё раз первый метод
    Я копаю второй.

    только на ассемблере
    Шутишь?
    Код еще на Си еще не работает, а ты хочешь раздуть его на тысячу строк.
    Если есть конкретные вопросы, задавай.
     
  18. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Адрес корзины для диска получить можно так:
    Получить Sid с помощью NtQueryTokenValue с параметром UserToken, передать его RtLConvertSidToString. Полученную строку вставить в следующую (для диска с):
    C:\recyclebin\%%\myfile

    Пишу по памяти и с мобильного, так что с именами мог что напутать. Знатоки, надеюсь,исправят:)
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    именами мог что напутать ... надеюсь,исправят
    Вместо NtQueryTokenValue следует читать ZwQueryInformationToken.
     
  20. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Masm32 пишет undefined symbol по этим функциям.
    Не могу найти нормальной инфы по ним.
    Что это за функции?
    Какие у них аргументы?
    Какие библиотеки требуют?
    Что возвращают?
    Можно пару строчек кода (на ассемблере)?