jc/md/lp-01/05 Driver élémentaire : corrigé 1 Driver élémentaire Émulateur Corrigé
Jan 17, 2016
jc/md/lp-01/05 Driver élémentaire : corrigé 1
Driver élémentaireÉmulateur
Corrigé
jc/md/lp-01/05 Driver élémentaire : corrigé 2
DRIVER
jc/md/lp-01/05 Driver élémentaire : corrigé 3
Déclarations
#include "stdafx.h"
#include <tchar.h>
#include <Pkfuncs.h>
// Buffer de travail (unicode)
#define BUFSIZE 256
WCHAR wcBuffer[BUFSIZE];
jc/md/lp-01/05 Driver élémentaire : corrigé 4
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)
jc/md/lp-01/05 Driver élémentaire : corrigé 5
Point d’entrée du driver
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 6
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;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 7
STR_Deinit
BOOL STR_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("STRINGS: STR_Deinit\n")));
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 8
STR_Open
DWORD STR_Open(DWORD hDeviceContext,
DWORD AccessCode,DWORD ShareMode)
{
DWORD dwRet = 1;
RETAILMSG(1,(TEXT("STRINGS: STR_Open\n")));
return dwRet;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 9
STR_Close
BOOL STR_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("STRINGS: STR_Close\n")));
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 10
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);
}
jc/md/lp-01/05 Driver élémentaire : corrigé 11
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;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 12
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) {
jc/md/lp-01/05 Driver élémentaire : corrigé 13
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
jc/md/lp-01/05 Driver élémentaire : corrigé 14
STR_IOControl (3)
//l’ IOControl de décryptage est à votre charge !!!
*pdwActualOut = dwLenOut;
RETAILMSG(1,(TEXT("STRINGS: STR_IOControl\n")));
return bRet;
} //STR_IOControl
jc/md/lp-01/05 Driver élémentaire : corrigé 15
STRINGS_DRV.def
LIBRARY STRINGS_DRV EXPORTS STR_Init
STR_Deinit STR_Open STR_Close STR_Read STR_Write STR_IOControl
jc/md/lp-01/05 Driver élémentaire : corrigé 16
Application
jc/md/lp-01/05 Driver élémentaire : corrigé 17
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
jc/md/lp-01/05 Driver élémentaire : corrigé 18
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;
jc/md/lp-01/05 Driver élémentaire : corrigé 19
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));
jc/md/lp-01/05 Driver élémentaire : corrigé 20
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;
}
jc/md/lp-01/05 Driver élémentaire : corrigé 21
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; }
jc/md/lp-01/05 Driver élémentaire : corrigé 22
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;}
jc/md/lp-01/05 Driver élémentaire : corrigé 23
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; }
jc/md/lp-01/05 Driver élémentaire : corrigé 24
Affichage de la chaîne reçue
// Affichage de ce qui a été lu avec MessageBox
MessageBox(NULL,r_ch,TEXT("StringApp"),MB_OK);
jc/md/lp-01/05 Driver élémentaire : corrigé 25
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; }
jc/md/lp-01/05 Driver élémentaire : corrigé 26
Affichage de la chaîne modifiée
// Affichage de la chaîne modifiée avec MessageBox
MessageBox(NULL,io_ch,TEXT("StringApp"),MB_OK);
jc/md/lp-01/05 Driver élémentaire : corrigé 27
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;}
jc/md/lp-01/05 Driver élémentaire : corrigé 28
Affichage de la chaîne reçue
// Affichage de la chaîne cryptée avec MessageBox
MessageBox(NULL,io_ch,TEXT("StringApp"),MB_OK);
jc/md/lp-01/05 Driver élémentaire : corrigé 29
Fin de l’application
// DeregisterDevice et fermeture des handles
DeregisterDevice(hDevice);
CloseHandle(hDevice);
CloseHandle(hStr);
return 0;
}// WinMain
jc/md/lp-01/05 Driver élémentaire : corrigé 30
Résultat de l’exécution (1)
jc/md/lp-01/05 Driver élémentaire : corrigé 31
Résultat de l’exécution (2)
jc/md/lp-01/05 Driver élémentaire : corrigé 32
Résultat de l’exécution (3)