320 likes | 387 Views
Driver élémentaire Émulateur. Corrigé. DRIVER. Déclarations. #include "stdafx.h" #include <tchar.h> #include <Pkfuncs.h> // Buffer de travail (unicode) #define BUFSIZE 256 WCHAR wcBuffer[BUFSIZE];. Déclaration des IOControl. #define IOCTL_TOLOWER
E N D
Driver élémentaireÉmulateur Corrigé Driver élémentaire : corrigé
DRIVER Driver élémentaire : corrigé
Déclarations #include "stdafx.h" #include <tchar.h> #include <Pkfuncs.h> // Buffer de travail (unicode) #define BUFSIZE 256 WCHAR wcBuffer[BUFSIZE]; Driver élémentaire : corrigé
Déclaration des IOControl #define IOCTL_TOLOWER \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CRYPTO \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) Driver élémentaire : corrigé
Point d’entrée du driver BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } Driver élémentaire : corrigé
STR_Init DWORD STR_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("STRINGS: STR_Init\n"))); // Mise à zéro du buffer memset(wcBuffer,0, (BUFSIZE * sizeof(WCHAR))); return dwRet; } Driver élémentaire : corrigé
STR_Deinit BOOL STR_Deinit(DWORD hDeviceContext) { RETAILMSG(1,(TEXT("STRINGS:STR_Deinit\n"))); return TRUE; } Driver élémentaire : corrigé
STR_Open DWORD STR_Open(DWORD hDeviceContext, DWORD AccessCode,DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("STRINGS: STR_Open\n"))); return dwRet; } Driver élémentaire : corrigé
STR_Close BOOL STR_Close(DWORD hOpenContext) { RETAILMSG(1,(TEXT("STRINGS: STR_Close\n"))); return TRUE; } Driver élémentaire : corrigé
STR_Read DWORD STR_Read(DWORD hOpenContext,LPVOID pBuffer, DWORD dwCount) { RETAILMSG(1,(TEXT("STRINGS: STR_Read\n"))); //copie de la chaîne. wcsncpy((LPWSTR)pBuffer,wcBuffer,dwCount); //retour : nombre de caractères lus return wcslen((LPWSTR)pBuffer); } Driver élémentaire : corrigé
STR_Write DWORD STR_Write(DWORD hOpenContext, LPCVOID pSourceBytes,DWORD NbOfBytes) { DWORD dwRet = NbOfBytes; // Écriture de la chaîne wcsncpy(wcBuffer, (LPWSTR)pSourceBytes, dwRet); // Retour : nombre de caractères écrits return dwRet; } Driver élémentaire : corrigé
STR_IOControl (1) BOOL STR_IOControl(DWORD hOpenContext, DWORD dwCode, PWCHAR pBufIn, DWORD dwLenIn, PWCHAR pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { BOOL bRet; DWORD i; switch(dwCode) { Driver élémentaire : corrigé
STR_IOControl (2) case IOCTL_TOLOWER: for(i = 0; i<dwLenOut; i++) pBufOut[i] = wcBuffer[i] + 0x20; bRet= TRUE; break; case IOCTL_CRYPTO: for(i = 0; i<dwLenOut; i++) pBufOut[i]=wcBuffer[i]+(WCHAR)rand()%128; bRet= TRUE; break; } //switch Driver élémentaire : corrigé
STR_IOControl (3) //l’ IOControl de décryptage est à votre charge !!! *pdwActualOut = dwLenOut; RETAILMSG(1,(TEXT("STRINGS: STR_IOControl\n"))); return bRet; } //STR_IOControl Driver élémentaire : corrigé
STRINGS_DRV.def LIBRARY STRINGS_DRV EXPORTS STR_Init STR_Deinit STR_Open STR_Close STR_Read STR_Write STR_IOControl Driver élémentaire : corrigé
Application Driver élémentaire : corrigé
En-tête de l’application #include "stdafx.h" #include <Pkfuncs.h> #define IOCTL_TOLOWER CTL_CODE(\ FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_CRYPTO CTL_CODE(\ FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define BUFFER_SIZE 256 Driver élémentaire : corrigé
Déclarations int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { HANDLE hDevice,hStr; DWORD dwNb,dwErreur; DWORD dwWritten = 0; DWORD dwBytesRead = BUFFER_SIZE; Driver élémentaire : corrigé
Déclarations et initialisation des buffers WCHAR r_ch[BUFFER_SIZE]; WCHAR io_ch[BUFFER_SIZE]; WCHAR* pString = TEXT("HA QUE COUCOU DANS LA MACHINE"); memset(&r_ch,'\0', BUFFER_SIZE * sizeof(WCHAR)); memset(&io_ch,'\0',BUFFER_SIZE * sizeof(WCHAR)); Driver élémentaire : corrigé
Chargement du driver // Chargement du driver avec RegisterDevice(), // Retourne hDevice qui est nul s’il y a une erreur hDevice=RegisterDevice( TEXT("STR"),1,TEXT("STRINGS_DRV.dll"),NULL); if (hDevice == 0) { MessageBox(NULL,_T("Pb Register"), _T("StringApp"),MB_OK); return 0; } Driver élémentaire : corrigé
Open // Ouverture du driver avec CreateFile() hStr = CreateFile(TEXT("STR1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if(INVALID_HANDLE_VALUE == hStr) { MessageBox(NULL,_T(" Pb Open"), _T("StringApp"),MB_OK); // DeregisterDevice et fermeture des Handle DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; } Driver élémentaire : corrigé
WRITE // Écriture de la chaîne avec WriteFile(), dwErreur=WriteFile(hStr,pString,(wcslen(pString)+1), &dwWritten,NULL); if (dwErreur == 0) //s’il y a une erreur { MessageBox(NULL,_T("Pb Write"), _T("StringApp"),MB_OK); // DeregisterDevice et fermeture des Handle DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hStr); return 0; } Driver élémentaire : corrigé
Read // Lecture de la chaine avec ReadFile() dwErreur=ReadFile(hStr,r_ch,sizeof(r_ch)/sizeof(WCHAR) ,&dwBytesRead,NULL); if(dwErreur == -1) //s’il y a une erreur de lecture { MessageBox(NULL,_T("Pb Read"), _T("StringApp"), MB_OK); // DeregisterDevice et fermeture des handles DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hStr); return 0; } Driver élémentaire : corrigé
Affichage de la chaîne reçue // Affichage de ce qui a été lu avec MessageBox MessageBox(NULL,r_ch,TEXT("StringApp"),MB_OK); Driver élémentaire : corrigé
IOControl TOLOWER // Appel de l'IOCTL TOLOWER avec DeviceIoControl() dwEerreur=DeviceIoControl(hStr,IOCTL_TOLOWER,NULL, NULL,io_ch,(wcslen(pString)+1),&dwNb,NULL); if (dwErreur == 0) //s’il y a une erreur dans IOCTL { MessageBox(NULL,_T("Pb Tolower"), _T("StringApp"), MB_OK); // DeregisterDevice et fermeture des handles DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hStr); return 0; } Driver élémentaire : corrigé
Affichage de la chaîne modifiée // Affichage de la chaîne modifiée avec MessageBox MessageBox(NULL,io_ch,TEXT("StringApp"),MB_OK); Driver élémentaire : corrigé
IOControl CRYPTO // Appel de l'IOCTL CRYPTO avec DeviceIoControl() dwErreur=DeviceIoControl(hStr,IOCTL_CRYPTO,NULL, NULL,io_ch,(wcslen(pString)+1),&dwNb,NULL); if (dwErreur == 0) //s’il y a erreur dans l’IOCTL { MessageBox(NULL,_T("Pb CRYPTO:"), _T("StringApp"), MB_OK); // DeregisterDevice et fermeture des Handle DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hStr); return 0; } Driver élémentaire : corrigé
Affichage de la chaîne reçue // Affichage de la chaîne cryptée avec MessageBox MessageBox(NULL,io_ch,TEXT("StringApp"),MB_OK); Driver élémentaire : corrigé
Fin de l’application // DeregisterDevice et fermeture des handles DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hStr); return 0; }// WinMain Driver élémentaire : corrigé
Résultat de l’exécution (1) Driver élémentaire : corrigé
Résultat de l’exécution (2) Driver élémentaire : corrigé
Résultat de l’exécution (3) Driver élémentaire : corrigé