1 /* Copyright (c) Mark Harmstone 2016-17
3 * This file is part of WinBtrfs.
5 * WinBtrfs is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public Licence as published by
7 * the Free Software Foundation, either version 3 of the Licence, or
8 * (at your option) any later version.
10 * WinBtrfs is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public Licence for more details.
15 * You should have received a copy of the GNU Lesser General Public Licence
16 * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
23 #define WIN32_NO_STATUS
26 #include <ndk/iofuncs.h>
28 #include "iconoverlay.h"
30 #include "../btrfsioctl.h"
32 #include "btrfsioctl.h"
35 HRESULT __stdcall
BtrfsIconOverlay::QueryInterface(REFIID riid
, void **ppObj
) {
36 if (riid
== IID_IUnknown
|| riid
== IID_IShellIconOverlayIdentifier
) {
37 *ppObj
= static_cast<IShellIconOverlayIdentifier
*>(this);
46 HRESULT __stdcall
BtrfsIconOverlay::GetOverlayInfo(PWSTR pwszIconFile
, int cchMax
, int* pIndex
, DWORD
* pdwFlags
) {
47 WCHAR dllpath
[MAX_PATH
];
49 GetModuleFileNameW(module
, dllpath
, sizeof(dllpath
));
51 if ((size_t)cchMax
< wcslen(dllpath
))
60 wcscpy(pwszIconFile
, dllpath
);
62 *pdwFlags
= ISIOI_ICONFILE
| ISIOI_ICONINDEX
;
67 HRESULT __stdcall
BtrfsIconOverlay::GetPriority(int *pPriority
) {
76 HRESULT __stdcall
BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath
, DWORD dwAttrib
) {
80 btrfs_get_file_ids bgfi
;
82 h
= CreateFileW(pwszPath
, 0, FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
, NULL
, OPEN_EXISTING
, FILE_FLAG_BACKUP_SEMANTICS
| FILE_FLAG_OPEN_REPARSE_POINT
, NULL
);
84 if (h
== INVALID_HANDLE_VALUE
)
87 Status
= NtFsControlFile(h
, NULL
, NULL
, NULL
, &iosb
, FSCTL_BTRFS_GET_FILE_IDS
, NULL
, 0, &bgfi
, sizeof(btrfs_get_file_ids
));
89 if (!NT_SUCCESS(Status
)) {
96 return (bgfi
.inode
== 0x100 && !bgfi
.top
) ? S_OK
: S_FALSE
;