Если вам нужна пуленепробиваемая защита ваших файлов, то просто защитить доступ к папке недостаточно, вам придется зашифровать их, и на рынке есть безопасные контейнеры и шифрование файловой системы.
Если это не требует высокой безопасности, я думаю, вы можете подключиться к 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), но это будет настоящий обходной путь. Я бы использовал что-то, что можно скомпилировать в собственный код.
Редактировать: Аой Карасу предоставила ссылку на сообщение, в котором предлагается использовать FileSystemFilterDriver, который, вероятно, является лучшей концепцией для реализации рассматриваемого приложения.
person
Falcon
schedule
02.04.2011