Есть задача. Блокировать все операции с носителем (дискета, зип, флэшка, и т.д.), если он "неправильный". Я написал в VC++ 7 длл, в которой обрабатываю все виды следующих функций:
CreateFile, MoveFile, CreateDirectory, SHCreateDirectory, SHFileOperation, DeleteFile, RemoveDirectory, OpenFile, _lcreat, SetCurrentDirectory, ShellExecute, WinExec, CreateProcess.
1. Прописываю в ветке реестра HKLM\Software\Microsoft\Windows NT\CurrentVersion\ в параметр AppInit_DLLs путь к своей длл-ке. Все работает пучком. Ни фар, ни ТоталКоммандер, ни Експлорер, ни Волков, ни Ворд (и т.д.) не могут ничего сделать с "неправильным" диском. Но

а) все это легко обходится с помощью командной строки
б) некоторым прогам (кроме Аутлук Экспресс пока не нашёл) также плевать на мои потуги

Лечится только непосредственным внедрением моей длл в процесс Аутлука.
Как это побороть?
2. Вот два отрывка из кода длл. Оба "правильно" работают (т.е. функции возвращают правильные результаты). Однако в первом варианте при вызове "родной" АПИ-функции всё работает как было задумано, а во втором "родные" функции возвращают ошибки. В чём может быть дело (только не надо про ошибку в ДНК, пожалуйста

)?
вариант 1.
....
//CreateFileA
BYTE cfa_FirsBytes[JMP_LEN];
BYTE cfa_JmpCmd[JMP_LEN];
DWORD cfa_dwProcAddress = 0;
....
static DWORD GetVolumeSerialA(char *lpPathName)
{
DWORD VolumeSerial = 0;
GetVolumeInformationA(lpPathName, NULL, 0, &VolumeSerial, NULL, NULL, NULL, 0);
return VolumeSerial;
}
//
//Begin OnCreateFileA
//
static HANDLE _stdcall OnCreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
DWORD dwProtect;
char drive[4] = {0, 0, 0, 0};
HANDLE hFile = INVALID_HANDLE_VALUE;
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, PAGE_EXECUTE_READWRITE, &dwProtect);
memmove((LPVOID)cfa_dwProcAddress, cfa_FirsBytes, JMP_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, dwProtect, &dwProtect);
try
{
if (!CheckDBforVolume(GetVolumeSerialA(strncpy((char *)(drive), lpFileName, 3))))
{
hFile = CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
}
catch (int) {}
/**/
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, PAGE_EXECUTE_READWRITE, &dwProtect);
memmove((LPVOID)cfa_dwProcAddress, cfa_JmpCmd, JMP_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, dwProtect, &dwProtect);
return hFile;
}
//
//End OnCreateFileA
//
BOOL OnIntercept(HANDLE hModule = NULL)
{
DWORD dwProtect;
DWORD dwTemp;
// Intercept CreateFileA function
cfa_dwProcAddress = (DWORD)GetProcAddress(GetModuleHandle(_T("KERNEL32.DLL")), _T("CreateFileA"));
cfa_JmpCmd[0] = jmp;
dwTemp = ((DWORD)OnCreateFileA) — (cfa_dwProcAddress + JMP_LEN);
memmove(&cfa_JmpCmd[1], &dwTemp, JMP_OPER_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, PAGE_EXECUTE_READWRITE, &dwProtect);
memmove(cfa_FirsBytes, (LPVOID)cfa_dwProcAddress, JMP_LEN);
memmove((LPVOID)cfa_dwProcAddress, cfa_JmpCmd, JMP_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, dwProtect, &dwProtect);
return TRUE;
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
char szStat[256];
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
return OnIntercept(hModule);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Вариант 2 (изменены только функции OnCreateFileA и GetVolumeSerialA)
static BOOL GetVolumeSerialA(const LPCSTR lpPathName)
....
{
char Drive[4];
DWORD VSer = 0;
wsprintf(Drive, "%c:\\", char(PathGetDriveNumberA(lpPathName) + 65));
if (!GetVolumeInformation(Drive, NULL, 0, &VSer, NULL, NULL, NULL, 0)) return false;
return CheckDBforVolume(VSer);
}
....
//
//Begin OnCreateFileA
//
static HANDLE _stdcall OnCreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)
{
DWORD dwProtect;
DWORD VolSer = 0;
char drive[4] = {0, 0, 0, 0};
HANDLE hFile = INVALID_HANDLE_VALUE;
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, PAGE_EXECUTE_READWRITE, &dwProtect);
memmove((LPVOID)cfa_dwProcAddress, cfa_FirsBytes, JMP_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, dwProtect, &dwProtect);
if (!GetVolumeSerialA(lpFileName))
{
try
{
hFile = CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
catch (int) {}
}
/**/
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, PAGE_EXECUTE_READWRITE, &dwProtect);
memmove((LPVOID)cfa_dwProcAddress, cfa_JmpCmd, JMP_LEN);
VirtualProtect((LPVOID)cfa_dwProcAddress, JMP_LEN, dwProtect, &dwProtect);
return hFile;
}
//
//End OnCreateFileA
//