#include <vector>
#include <Sfc.h>
//#pragma comment(lib, "Sfc.lib")
#include "Module.h"
class CProtectedFileData : public PROTECTED_FILE_DATA
{
public:
CProtectedFileData(DWORD dwFileNumber = 0)
{
memset(this, 0, sizeof(PROTECTED_FILE_DATA));
this->FileNumber = dwFileNumber;
}
};
static HRESULT EnumProtectedFileNames(std::vector<CString>& strFileNames)
{
USES_CONVERSION;
HRESULT hr = S_OK;
strFileNames.clear();
CModule module;
// sfc.dllのキャッシュも兼ねています
HINSTANCE hInst = module.LoadLibrary(_T("sfc.dll"));
if (hInst == NULL)
{
return E_NOTIMPL;
}
DWORD i = 0;
while (1)
{
CProtectedFileData data(i);
BOOL br = CSfcHelper::Probe_SfcGetNextProtectedFile(NULL, &data);
if (!br)
{
break;
}
strFileNames.push_back(W2T(data.FileName));
i++;
}
return S_OK;
}
static BOOL Probe_SfcGetNextProtectedFile(HANDLE RpcHandle, PPROTECTED_FILE_DATA ProtFileData)
{
CModule module;
HINSTANCE hInst = module.LoadLibrary(_T("sfc.dll"));
if (hInst == NULL)
{
return FALSE;
}
typedef BOOL (WINAPI *SFC_GET_NEXT_PROTECTED_FILE)(HANDLE RpcHandle, PPROTECTED_FILE_DATA ProtFileData);
SFC_GET_NEXT_PROTECTED_FILE func = (SFC_GET_NEXT_PROTECTED_FILE)module.GetProcAddress(_T("SfcGetNextProtectedFile"));
if (func == NULL)
{
return FALSE;
}
return (*func)(RpcHandle, ProtFileData);
}