32
jc/md/lp-01/05 Driver élémentaire : corrigé 1 Driver élémentaire Émulateur Corrigé

Driver élémentaire Émulateur

  • Upload
    umeko

  • View
    36

  • Download
    0

Embed Size (px)

DESCRIPTION

Driver élémentaire Émulateur. Corrigé. DRIVER. Déclarations. #include "stdafx.h"   #include #include // Buffer de travail (unicode) #define BUFSIZE 256 WCHAR wcBuffer[BUFSIZE];. Déclaration des IOControl. #define IOCTL_TOLOWER \ - PowerPoint PPT Presentation

Citation preview

Page 1: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 1

Driver élémentaireÉmulateur

Corrigé

Page 2: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 2

DRIVER

Page 3: Driver élémentaire Émulateur

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];

Page 4: Driver élémentaire Émulateur

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)

Page 5: Driver élémentaire Émulateur

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;

}

Page 6: Driver élémentaire Émulateur

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;

}

Page 7: Driver élémentaire Émulateur

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;

}

Page 8: Driver élémentaire Émulateur

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;

}

Page 9: Driver élémentaire Émulateur

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;

}

Page 10: Driver élémentaire Émulateur

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);

}

Page 11: Driver élémentaire Émulateur

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;

}

Page 12: Driver élémentaire Émulateur

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) {

Page 13: Driver élémentaire Émulateur

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

Page 14: Driver élémentaire Émulateur

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

Page 15: Driver élémentaire Émulateur

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

Page 16: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 16

Application

Page 17: Driver élémentaire Émulateur

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

Page 18: Driver élémentaire Émulateur

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;

Page 19: Driver élémentaire Émulateur

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));

Page 20: Driver élémentaire Émulateur

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;

}

Page 21: Driver élémentaire Émulateur

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; }

Page 22: Driver élémentaire Émulateur

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;}

Page 23: Driver élémentaire Émulateur

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; }

Page 24: Driver élémentaire Émulateur

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);

Page 25: Driver élémentaire Émulateur

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; }

Page 26: Driver élémentaire Émulateur

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);

Page 27: Driver élémentaire Émulateur

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;}

Page 28: Driver élémentaire Émulateur

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);

Page 29: Driver élémentaire Émulateur

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

Page 30: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 30

Résultat de l’exécution (1)

Page 31: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 31

Résultat de l’exécution (2)

Page 32: Driver élémentaire Émulateur

jc/md/lp-01/05 Driver élémentaire : corrigé 32

Résultat de l’exécution (3)