Si desea una protección a prueba de balas de sus archivos, simplemente proteger el acceso a la carpeta no es suficiente, tendría que encriptarlos y existen contenedores seguros y sistemas de archivos encyptions en el mercado.
Si no necesita ser de alta seguridad, puede conectarlo a Windows, supongo. Necesitará especialmente enganchar en las funciones de listado de directorios, como FindFirstFile, FindNextFile y OpenFile también probablemente (y en sus derivados como FindFirstFileW) y tal vez algunos otros.
haces eso redirigiendo las llamadas a KERNEL32.dll a sus funciones habituales, ver un pequeño ejemplo de código siguiente que encontré en el Internet:
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;
}
Lo que quiere hacer se puede hacer también con Java (JNI) o C# (pinvoke), pero sería un verdadero desvío. Usaría algo que pueda compilarse en código nativo.
Editar: Aoi Karasu proporciona un enlace a un post que sugiere utilizar un FileSystemFilterDriver, que es probablemente la mejor concepto para darse cuenta de la aplicación en cuestión.
¿Quiere decir que su programa va a ser un servicio y todas las acciones del usuario relacionadas con las carpetas deben realizarse a través de su servicio? Suena complicado ... –
@Armen Tsirunyan - Sí, se puede decir así. Algunas carpetas estarán protegidas con contraseña, otras no. –
Aquí hay una pregunta complicada (y creo que la solución es un controlador de cifrado): Alice y Bob conectados a una máquina con la carpeta cifrada F. Alice conoce la contraseña de F y Bob no conoce la contraseña de F. Bob intenta ingresar a la carpeta de maneras "extrañas" (cmd.exe o su propia aplicación) y encuentra archivos cifrados, como deberían ser. Alice inserta la contraseña para F, por lo que descifrar los archivos. Ahora, ¿cómo descifras los archivos y te aseguras de que Bob no los pueda tocar? ¡De alguna forma hay que asegurarse de que los usuarios que no tienen acceso a F no puedan acceder a él! – TCS