Если вам нужна пуленепробиваемая защита ваших файлов, то просто защиты доступа к папке недостаточно, вам придется зашифровать их, и на рынке есть защищенные контейнеры и правила файловой системы.
Если вам не нужен высокий уровень безопасности, вы можете подключиться к Windows. Вам особенно нужно подключиться к функциям листинга каталогов, таким как FindFirstFile, FindNextFile и OpenFile, а также, вероятно, (и к их производным, таким как FindFirstFileW) и, возможно, к некоторым другим.
Вы делаете это, перенаправляя вызовы kernel32.dll на ваши пользовательские функции, см. Небольшой пример кода ниже, который я нашел в интернете:
unsigned char Store[10];
//redirect FindNextFileW to your custom function
void HookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Kernel32.dll");
long pa = (long)GetProcAddress(hmod,"FindNextFileW");
long pa2 = (long)MyFindNextFile;
long dAddr = pa2 - pa - 5;
unsigned char *p = (unsigned char *)pa;
unsigned char *p2 = (unsigned char *)(&dAddr);
VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
for (int i=0;i<5;i++)
Store[i] = p[i];
p[0] = (unsigned char)0xE9;
for (int i=0;i<4;i++)
p[i + 1] = p2[i];
VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}
void UnHookAPI()
{
DWORD OldProtect, NewProtect = PAGE_EXECUTE_READWRITE;
HMODULE hmod = GetModuleHandle("Kernel32.dll");
long pa = (long)GetProcAddress(hmod,"FindNextFileW");
unsigned char *p = (unsigned char *)pa;
VirtualProtect((void *)pa,5,NewProtect,&OldProtect);
for (int i=0;i<5;i++)
p[i] = Store[i];
VirtualProtect((void *)pa,5,OldProtect,&NewProtect);
}
BOOL WINAPI MyFindNextFile(HANDLE hFindFile,LPWIN32_FIND_DATAW lpFindFileData)
{
UnHookAPI();
BOOL ans = FindNextFileW(hFindFile, lpFindFileData);
//your logic here, display password prompt to user e.g.
HookAPI();
return ans;
}
То, что вы хотите сделать, также может быть сделано с помощью Java (JNI) или C # (pinvoke), но это будет настоящий обходной путь. Я бы использовал что-то, что можно скомпилировать в нативный код.
Edit:
Аой Карасу предоставил ссылку на публикацию, в которой предлагается использовать FileSystemFilterDriver , что является , вероятно, лучшей концепцией для реализации рассматриваемого приложения.