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 if (GetModuleFileNameW(module
, pwszIconFile
, cchMax
) == 0)
50 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER
)
60 *pdwFlags
= ISIOI_ICONFILE
| ISIOI_ICONINDEX
;
65 HRESULT __stdcall
BtrfsIconOverlay::GetPriority(int *pPriority
) {
74 HRESULT __stdcall
BtrfsIconOverlay::IsMemberOf(PCWSTR pwszPath
, DWORD dwAttrib
) {
78 btrfs_get_file_ids bgfi
;
80 h
= CreateFileW(pwszPath
, 0, FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
, nullptr, OPEN_EXISTING
, FILE_FLAG_BACKUP_SEMANTICS
| FILE_FLAG_OPEN_REPARSE_POINT
, nullptr);
82 if (h
== INVALID_HANDLE_VALUE
)
85 Status
= NtFsControlFile(h
, nullptr, nullptr, nullptr, &iosb
, FSCTL_BTRFS_GET_FILE_IDS
, nullptr, 0, &bgfi
, sizeof(btrfs_get_file_ids
));
87 if (!NT_SUCCESS(Status
))
90 return (bgfi
.inode
== 0x100 && !bgfi
.top
) ? S_OK
: S_FALSE
;