Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése: Virtuális.

Slides:



Advertisements
Hasonló előadás

Advertisements

„Esélyteremtés és értékalakulás” Konferencia Megyeháza Kaposvár, 2009
A kétdimenziós tömbök Páll Boglárka. Ismétlés: Az egydimenziós tömbök  Meghatározás: A tömb egy olyan összetett adatszerkezet amely több rögzített számú,
1. foreach( fejlesztő in Lurdyház ) { fejlesztő.Agy. Delete If( delegate ( Content c ) { return c.ContainsAny( „Win32 / User32.dll”, „GDI”,„GDI+”,„WindowsForms”,
Tester Developer Architect Project Manager Business Analyst Designer Database Professional.
Mintacím szerkesztése •Mintaszöveg szerkesztése •Második szint •Harmadik szint •Negyedik szint •Ötödik szint D modelling in the terrestrial.
Nyereményjátékok és a Facebook - aki mer, az nyer!?”
Richter Elek Technikai terméktámogatási felelős Microsoft Magyarország.
21 Years of Partnership and Innovation 1989 Citrix Systems founded 2010 Citrix signed licensing agreement with Microsoft for NT Server Introduced Independent.
2 8 Kiadás éve / Platform Server (1000’s of users) Workgroup (Dozens of users) Desktop (Single User) Laptop Tablet PC Windows CE.
Les meilleures photos de L'année 2005 D'après NBC A life for two, full of tenderness, obtains happiness as they get closer to heaven. Az élet kettesben.
System Statistical Functions. CPU Tesztelése SELECT AS busy Vissza adja milliszekundumban, mennyi időt töltött munkával a szerverünk indítás.
Árvai Zoltán Számalk Oktató központ.
Bevezetés a tárgyakhoz Tárgyak  Objects are the containers for values of a specified type  Objects are either signals, variables or constants  Once.
FelültöltésVHDL Felültöltés (Overloading) n Áttekintés n Példák.
 Lineáris egyenlet  algebrai egyenlet  konstansok és első fokú ismeretlenek  pl.: egyenes egyenlete  Lineáris egyenletrendszer  lineáris egyenletek.
Socket programozás Példák
Image készítés Windows AIK segítségével
TRANZIENS ADATTÁROLÁS State objektum Egy alkalmazásszintű gyűjtemény (Dictionary), mely Tombstone esetén megőrzi tartalmát a memóriában kulcs/érték párokként.
Az erőátviteli rendszer
Adatbáziskezelés Horváth Ernő 1. Elérhetőségek Kiss Jenő Horváth Ernő Tanszéki honlap
Delegátumok C#-ban Krizsán Zoltán iit 1.0.
Infokom. rendsz. 11. előadás nov Kommunikációs rendszerek alapjai 11. előadás Rádiós adathálózatok Bluetooth, ZigBee, WiFi, WiMAX, Takács.
Infokommunikációs rendszerek 11
Pázmány - híres perek Pázmány híres perek.
Course Situation and Event Driven Models for Multilevel Abstraction Based Virtual Engineering Spaces Óbuda University John von Neumann Faculty of Informatics.
Oracle multimédia Kiss Attila Információs Rendszerek Tanszék
Kliensoldali Programozás
6. Előadás Merevítő rendszerek típusok, szerepük a tervezésben
Module 2: A Windows XP Professional automatikus telepítése
VFP xBase adatkezelés - munkaterületek - DML - DDL - navigáció - eljárások, függvények - vezérlési szerkezetek - változók - képernyő IO - mintaprogram.
A megértés körei Binzberger Viktor Budapest Műszaki és Gazdaságtudományi Egyetem Filozófia és Tudománytörténet Tanszék.
PHP VI Adatbázisok, MySQL
dr. Szalkai István Pannon Egyetem, Veszprém
Multimédiás programok készítése Macromedia Director fejlesztői környezetben 4. előadás Készítette: Kosztyán Zsolt
Service Manager.. Remedy Action Request System OpenView Operations.
„MICROSOFT IT ÜZLETI INTELLIGENCIA MEGOLDÁS BEMUTATÓ” Avagy az IT adat vizualizációs lehetőségi egyéb szervezeti egységek felé („ablak” a nagyvilágra)
Edge Transport Routing and AV/AS Enterprise Network External SMTP servers Phone system (PBX or VOIP) Client Access Client connectivity Web services.
Windows Server 2008 { PowerShell }
„MICROSOFT SYSTEM CENTER 2012 OPERATIONS MANAGER” Intelligens mérési megoldások gyorsan Benkovics Viktor Vezető tanácsadó Microsoft Magyarország – Services.
Alertet indíthat egy: SQL Server esemény (LOG) SQL Server performancia érték WMI events Alert végezhet: Operátor értesítést JOB indítás (válasz az eseményre)
Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése: Egyszerű.
szakmérnök hallgatók számára
Elektroanalitikához segédábrák Az ábrák több, részben szerzői jogokkal védett műből, oktatási célra lettek kivéve. Csak az intranetre tehetők, továbbmásolásuk,
WAP, WML Felhasznált források: Developer’s Guide v1.2 (Nokia WAP Toolkit) WML Reference v1.1.
Szervező program Pénzügy figyelő, számlázó program Legújabb alkalmazás.NET Framework 2.0 WSE.NET Framework 4.0 WCF Régebbi, jól bevált alkalmazás.
Egy GAZDAG HIBAJELENTÉS elég információt tartalmaz ahhoz, hogy AZONNALI LÉPÉSEKET lehessen tenni, a javítás érdekében.
Gábor Dénes Főiskola (IAI)Programozási technológia (Java) - III. / 1 13.Állományok, bejegyzések 14.Folyamok 15.Közvetlen hozzáférésű állomány.
Null Hypothesis (H 0 ) is true He truly is not guilty Alternative Hypothesis (H 1 ) is true He truly is guilty Accept Null Hypothesis Acquittal Right decision.
Hasznos ismeretek Hogyan bővítsük ismereteinket AVRDUDEflags -E noreset.
var q = ( from c in dc.Customers where c.City == "London" where c.City == "London" select c).Including( c => c.Orders ); select c).Including(
Tanulni, tanulni, tanulni Értékesítői képességek, a személyzet képzése.
Könyvtár, csomag és alprogramokVHDL Könyvtár, csomag és alprogram n Library és use n Package n Alprogramok –Procedure –Function –Resolution function Egy.
Budapesti Műszaki és Gazdaságtudomanyi Egyetem Elektronikus Eszközök Tanszéke 1 Tokozások termikus tesztje, minősítése.
II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for.
 Map  Reduce  Scan  Histogram  Compact const size_t dataSize = 1024; cl_kernel mapKernel = cl.createKernel(clProgram, "map"); float* hData = new.
GPGPU labor X. Monte Carlo módszerek. Kezdeti teendők Tantárgy honlapja, Monte Carlo módszerek A labor kiindulási alapjának letöltése (lab10_base.zip),
GPGPU Labor 15.. Párhuzamos primitívek Map Reduce Scan Histogram Compact.
Készült az ERFP – DD2002 – HU – B – 01 szerzősésszámú projekt támogatásával Chapter 1 / 1 C h a p t e r 1 Introduction.
HTTP kommunikáció Androidon HttpClient-en keresztűl HttpPost/HttpGet objektum használatával HttpClient execute metódusának meghívása.
- Group Policy - Group Policy Preferences - Group Policy 4x5 - Optimális munkakörnyezet – az első lépcsőfok.
© 2013, LogMeIn, Inc. | The Capability Cloud TM Git használata Visual Studio-ból.
 OpenCL platform  Számító eszközök  OpenCL kontextusok  Parancs sorok  Szinkronizáció  Memória objektumok  OpenCL programok  OpenCL függvények.
Web Application 1 Web Application 3 Web Application 2 Web Application 4 Shared Service Provider 1 Shared Service Provider 2 Excel Services1 Search1.
Objektum orientált programozás
Uraim és hölgyeim, itt az új 2011-es Pirelli Naptár A naptár első része a nők naptára, míg a második rész a férfiaké.
Fej irányultságának becslése Ügyféltérben gyanús viselkedés jelzéséhez Kültéren kiegészítő hő szenzor szükséges.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Microsoft SQL licenselés a gyakorlatban
Függvénysablonok használata
Előadás másolata:

Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése: Virtuális lemezegység driver előadás dr. Robu Judit szeminárium drd. Lukács Sándor

BBTE, Alkalmazások és operációs rendszerek optimizálása 2 A feladat megfogalmazása... egy virtuális lemezegység létrehozása, amely segítségével egy image állományt egy lemezegységként tudunk kezelni működjön floppy és mervelmez partíciók esetén is működjön CD és DVD ISO képek esetén is lehessen egy állomány csak egy bizonyos részét lemezegységként használni az eredei ötlet a SIMICS virtuális lemezegységeinek Windows alá történő betükrözése volt

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 3 A megoldás alapötletei virtuális lemezegység driver minden virtuális lemezegység számára egy-egy device objektum minden device objektum számára egy-egy szimbolikus link pl. „\\dosdevices\\b:” minden lemezegységnek megfelel háttérben egy-egy állomány az IRP_MJ_READ és IRP_MJ_WRITE műveleteket úgy oldjuk meg, hogy háttérben az állományból/-ba olvassuk/írjuk az adatokat implementálunk egy saját IOCTL-t a mount művelet számára minden device objektumhoz rendelünk egy-egy device extensiont ebben tároljuk a driver/device specifikus információkat, mint pl. a lemezegységnek megfelelő állomány handel-je, a lemezegység típusa (cd-rom, floppy), a lemez geometriája (CHS) etc. minimális számú standard IOCTL-t implementálunk ahhoz, hogy írható-olvasható lemezegységket tudjunk szimulálni

WIN32, ALKALMAZÁSOK VDISK driver DRV DEVOBJ VOL DEVOBJ dev ext, IMAGE dev ext VDCONF MOUNT kérés NTFS, FASTFAT stb. VOL DEVOBJ dev ext merevlemez IMG ISO IRP_MJ_READ IRP_MJ_WRITE ZwReadFile ZwWriteFile

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 5 Image információk 1 typedef struct _IMAGE { // device extension a VOLUME OBJECT-ek számára PDEVICE_OBJECT DeviceObject; UNICODE_STRING DeviceName; UNICODE_STRING DosDeviceName; // user supplied geometry and partition information DISK_GEOMETRY DiskGeometry; PARTITION_INFORMATION_EX PartInfo; // offset and length inside the file QWORD ImageOffset; QWORD ImageSize; // handle of the file image HANDLE DiskImage; BOOLEAN ReadOnly; DWORD DevNumber; } IMAGE, *PIMAGE; typedef struct _DEVICE_EXTENSION { // dev ext DRVOBJ számára PDEVICE_OBJECT DeviceObject; } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 6 Image információk 2 typedef struct _DISK_GEOMETRY { LARGE_INTEGER Cylinders; MEDIA_TYPE MediaType; DWORD TracksPerCylinder; DWORD SectorsPerTrack; DWORD BytesPerSector; } DISK_GEOMETRY, *PDISK_GEOMETRY; typedef struct _PARTITION_INFORMATION_EX { PARTITION_STYLE PartitionStyle; LARGE_INTEGER StartingOffset; LARGE_INTEGER PartitionLength; DWORD PartitionNumber; BOOLEAN RewritePartition; union { PARTITION_INFORMATION_MBR Mbr; PARTITION_INFORMATION_GPT Gpt; }; } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 7 Globális adatok typedef struct _DRV_GLOBAL_DATA { DRV_SPIN_LOCK Lock; ULONG Flags; // DRV specific fields PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT DeviceObject; // driver specific string ids UNICODE_STRING DeviceName; UNICODE_STRING DosDeviceName; // device name generator DWORD DevCounter; // IMAGE-ek száma DWORD MountedCount; // a mountolt IMAGE-ek száma DWORD DevNumber; } DRV_GLOBAL_DATA, *PDRV_GLOBAL_DATA;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 8 DriverEntry 1 // initialize the dispatch entry points DriverObject->MajorFunction[IRP_MJ_CREATE] = Drv_MJ_CREATE; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Drv_MJ_CLEANUP; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Drv_MJ_CLOSE; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Drv_MJ_DEVICE_CONTROL; DriverObject->MajorFunction[IRP_MJ_READ] = Drv_MJ_READ; DriverObject->MajorFunction[IRP_MJ_WRITE] = Drv_MJ_WRITE; // create the main device object RtlInitUnicodeString(&(DrvGlobalData.DeviceName), DEVICE_NAME); Status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), &DrvGlobalData.DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DrvGlobalData.DeviceObject );

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 9 DriverEntry 2 DevExt = (PDEVICE_EXTENSION)DrvGlobalData.DeviceObject->DeviceExtension; DevExt->DeviceObject = DrvGlobalData.DeviceObject; // no image is mounted yet DrvGlobalData.DevCounter = 0; DrvGlobalData.MountedCount = 0; DrvGlobalData.DevNumber = 0x1000;... // create symbolic link RtlInitUnicodeString(&(DrvGlobalData.DosDeviceName), L"\\dosdevices\\vdiskdev"); if (NT_SUCCESS(IoCreateSymbolicLink(&(DrvGlobalData.DosDeviceName), &DrvGlobalData.DeviceName))) { ExKdPrint((" DriverEntry - symbolic link %S created\n", DrvGlobalData.DosDeviceName.Buffer)); }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 10 IRP_MJ_CREATE // request to open the device if (DeviceObject == DrvGlobalData.DeviceObject) { ExKdPrint((" vdisk.sys device object opened\n")); Irp->IoStatus.Information = FILE_OPENED; Status = STATUS_SUCCESS; } else { // try to locate a corresponding image object device Image = (PIMAGE)DeviceObject->DeviceExtension; if (Image != NULL) { ExKdPrint((" image device %S opened\n", Image->DosDeviceName.Buffer)); Irp->IoStatus.Information = FILE_OPENED; Status = STATUS_SUCCESS; } else { ExKdPrint((" try to open an invalid object/device\n")); Irp->IoStatus.Information = FILE_DOES_NOT_EXIST; Status = STATUS_OBJECT_NAME_NOT_FOUND; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 11 IRP_MJ_DEVICE_CONTROL 1 ExKdPrint((" Drv_MJ_DEVICE_CONTROL \n")); switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_DISK_GET_PARTITION_INFO: Status = Drv_IOCTL_DISK_GET_PARTITION_INFO(DeviceObject, Irp, IrpSp); break; case IOCTL_DISK_GET_PARTITION_INFO_EX: Status = Drv_IOCTL_DISK_GET_PARTITION_INFO_EX(DeviceObject, Irp, IrpSp); break; case IOCTL_CDROM_READ_TOC: Status = Drv_IOCTL_CDROM_READ_TOC(DeviceObject, Irp, IrpSp); break; case IOCTL_DISK_GET_DRIVE_GEOMETRY: case IOCTL_CDROM_GET_DRIVE_GEOMETRY: Status = Drv_IOCTL_DISK_GET_DRIVE_GEOMETRY(DeviceObject, Irp, IrpSp); break; case IOCTL_DISK_GET_LENGTH_INFO: Status = Drv_IOCTL_DISK_GET_LENGTH_INFO(DeviceObject, Irp, IrpSp); break;...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 12 IRP_MJ_DEVICE_CONTROL 2... case IOCTL_DISK_MEDIA_REMOVAL: Status = Drv_IOCTL_DISK_MEDIA_REMOVAL(DeviceObject, Irp, IrpSp); break; case IOCTL_DISK_CHECK_VERIFY: case IOCTL_STORAGE_CHECK_VERIFY: case IOCTL_STORAGE_CHECK_VERIFY2: case IOCTL_CDROM_CHECK_VERIFY: Status = Drv_IOCTL_DISK_CHECK_VERIFY(DeviceObject, Irp, IrpSp); break; case IOCTL_DISK_IS_WRITABLE: Status = Drv_IOCTL_DISK_IS_WRITABLE(DeviceObject, Irp, IrpSp); break; case IOCTL_STORAGE_GET_DEVICE_NUMBER: Status = Drv_IOCTL_STORAGE_GET_DEVICE_NUMBER(DeviceObject, Irp, IrpSp); break; case IOCTL_DRV_MOUNT_IMAGE: Status = Drv_IOCTL_DRV_MOUNT_IMAGE(DeviceObject, Irp, IrpSp); break;...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 13 IOCTL_DISK_GET_DRIVE_GEOMETRY Image = (PIMAGE)DeviceObject->DeviceExtension; ExKdPrint((" Drv_IOCTL_DISK_GET_DRIVE_GEOMETRY\n")); if (Image == NULL) { Irp->IoStatus.Information = 0; return STATUS_INVALID_DEVICE_REQUEST; } if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY)) { Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); Status = STATUS_BUFFER_TOO_SMALL; // inform the caller we need bigger buffer } else { PDISK_GEOMETRY Geometry; Geometry = (PDISK_GEOMETRY)Irp->AssociatedIrp.SystemBuffer; RtlCopyMemory(Geometry, &Image->DiskGeometry, sizeof(DISK_GEOMETRY)); Irp->IoStatus.Information = sizeof(DISK_GEOMETRY); Status = STATUS_SUCCESS; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 14 IOCTL_DISK_GET_LENGTH_INFO Image = (PIMAGE)DeviceObject->DeviceExtension; ExKdPrint((" Drv_IOCTL_DISK_GET_LENGTH_INFO\n")); if (Image == NULL) { Irp->IoStatus.Information = 0; return STATUS_INVALID_DEVICE_REQUEST; } if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GET_LENGTH_INFORMATION)) { Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION); Status = STATUS_BUFFER_TOO_SMALL; // Inform the caller we need bigger buffer } else { PGET_LENGTH_INFORMATION LengthInfo; LengthInfo = (PGET_LENGTH_INFORMATION)Irp->AssociatedIrp.SystemBuffer; LengthInfo->Length.QuadPart = Image->DiskGeometry.BytesPerSector * Image->DiskGeometry.SectorsPerTrack * Image->DiskGeometry.TracksPerCylinder * Image->DiskGeometry.Cylinders.QuadPart; Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION); Status = STATUS_SUCCESS; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 15 IOCTL_CDROM_READ_TOC Image = (PIMAGE)DeviceObject->DeviceExtension; ExKdPrint((" Drv_IOCTL_CDROM_READ_TOC\n")); if (Image == NULL) { Irp->IoStatus.Information = 0; return STATUS_INVALID_DEVICE_REQUEST; } if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(CDROM_TOC)) { Irp->IoStatus.Information = sizeof(CDROM_TOC); Status = STATUS_BUFFER_TOO_SMALL; // Inform the caller we need bigger buffer } else { PCDROM_TOC CdRomToc; CdRomToc = (PCDROM_TOC)Irp->AssociatedIrp.SystemBuffer; CdRomToc->FirstTrack = 1; CdRomToc->LastTrack = 1; CdRomToc->TrackData[0].Control = TOC_DATA_TRACK; Irp->IoStatus.Information = sizeof(CDROM_TOC); Status = STATUS_SUCCESS; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 16 IOCTL_DISK_IS_WRITEABLE Image = (PIMAGE)DeviceObject->DeviceExtension; ExKdPrint((" Drv_IOCTL_DISK_IS_WRITABLE\n")); if (Image == NULL) { Irp->IoStatus.Information = 0; return STATUS_INVALID_DEVICE_REQUEST; } if (Image->ReadOnly) { Status = STATUS_MEDIA_WRITE_PROTECTED; } else { Status = STATUS_SUCCESS; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 17 A mount művelet implementálása typedef struct _MOUNT { CHAR FileName[1024]; // fully qualified image name // (ex. “c:\\dir1\\dir2\\image.iso") QWORD ImageOffset; // offset and length inside the file QWORD ImageSize; CHAR DosDevName[64]; // fully qualified dos device name // (ex. "\\dosdevices\\v:") BOOLEAN ReadOnly; // mount as a ReadOnly image DISK_GEOMETRY DiskGeometry; // user supplied geometry and PARTITION_INFORMATION_EX PartInfo; // partition information BOOLEAN CdRom; // TRUE for CD-ROM images int Status; } MOUNT_IMAGE, *PMOUNT_IMAGE;

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 18 IOCTL_DRV_MOUNT_IMAGE 1... static CHAR FullFileName[1024]; static CHAR DevName[64], Hex[20]; UNREFERENCED_PARAMETER(IrpSp); ExKdPrint((" Drv_IOCTL_DRV_MOUNT_IMAGE\n")); if (DeviceObject != DrvGlobalData.DeviceObject) { ExKdPrint((" invalid device object, invalid request\n")); return STATUS_INVALID_DEVICE_REQUEST; } Params = (PMOUNT_IMAGE)(Irp->AssociatedIrp.SystemBuffer); // bytes returned Irp->IoStatus.Information = sizeof(MOUNT_IMAGE); // inialize ImageFileName #pragma warning(suppress:4995) strcpy(FullFileName, "\\??\\"); #pragma warning(suppress:4995) strcat(FullFileName, Params->FileName);...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 19 IOCTL_DRV_MOUNT_IMAGE 2... RtlInitAnsiString(&AnsiName, FullFileName); RtlAnsiStringToUnicodeString(&ImageFileName, &AnsiName, TRUE); InitializeObjectAttributes(&ObjAttribs, &ImageFileName, OBJ_KERNEL_HANDLE, NULL, NULL); Status = ZwOpenFile(&DiskImage, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjAttribs, &IoStatus, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT); if (!NT_SUCCESS(Status)) { ExKdPrint((" Can't open disk image %S, error %s\n", ImageFileName.Buffer, DrvNtStatusToString(Status))); RtlFreeUnicodeString(&ImageFileName); } else { RtlFreeUnicodeString(&ImageFileName);...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 20 IOCTL_DRV_MOUNT_IMAGE 3... // init device name strcpy(DevName, "\\vdimg"); DrvGlobalData.DevCounter++; Hex[4] = 0; Hex[0] = NameChars[(DrvGlobalData.DevCounter & 0xF000) >> 12]; Hex[1] = NameChars[(DrvGlobalData.DevCounter & 0x0F00) >> 8]; Hex[2] = NameChars[(DrvGlobalData.DevCounter & 0x00F0) >> 4]; Hex[3] = NameChars[(DrvGlobalData.DevCounter & 0x000F)]; strcat(DevName, Hex); RtlInitAnsiString(&AnsiName, DevName); RtlAnsiStringToUnicodeString(&DeviceName, &AnsiName, TRUE); // create device object Status = IoCreateDevice( DrvGlobalData.DriverObject, sizeof(IMAGE), &DeviceName, Params->CdRom ? FILE_DEVICE_CD_ROM : FILE_DEVICE_VIRTUAL_DISK, 0, FALSE, &NewDeviceObject);...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 21 IOCTL_DRV_MOUNT_IMAGE 4... if (!NT_SUCCESS(Status)) { ExKdPrint(("couldn't create dev object, %s\n", DrvNtStatusToString(Status))); // deinit Image ZwClose(&DiskImage); RtlFreeUnicodeString(&DeviceName); } else { ExKdPrint((" device object for image created\n")); Image = (PIMAGE)NewDeviceObject->DeviceExtension; Image->DeviceObject = NewDeviceObject; Image->DeviceName = DeviceName; if (Params->CdRom || Params->ReadOnly) { Image->DeviceObject->Characteristics |= FILE_READ_ONLY_DEVICE; } // init DosDeviceName RtlInitAnsiString(&AnsiName, Params->DosDevName); RtlAnsiStringToUnicodeString(&Image->DosDeviceName, &AnsiName, TRUE); ExKdPrint((" devicename %S dosdevicename %S\n", Image->DeviceName.Buffer, Image->DosDeviceName.Buffer));...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 22 IOCTL_DRV_MOUNT_IMAGE 5... // set device flags Image->DeviceObject->Flags |= DO_DIRECT_IO; Image->DeviceObject->Flags |= DO_POWER_PAGABLE; Image->DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; // create symbolic link IoCreateSymbolicLink(&Image->DosDeviceName, &Image->DeviceName); // set image file handle Image->DiskImage = DiskImage; Image->ReadOnly = Params->ReadOnly; // set image size and offset Image->ImageSize = Params->ImageSize; Image->ImageOffset = Params->ImageOffset; ExKdPrint((" imagesize 0x%I64x imageoffset 0x%I64x\n", Image->ImageSize, Image->ImageOffset)); // copy geometry and partition info RtlCopyMemory(&Image->DiskGeometry, &Params->DiskGeometry, sizeof(DISK_GEOMETRY)); RtlCopyMemory(&Image->PartInfo, &Params->PartInfo, sizeof(PARTITION_INFORMATION_EX)); DrvGlobalData.MountedCount++; DrvGlobalData.DevNumber++; Image->DevNumber = DrvGlobalData.DevNumber; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 23 IRP_MJ_READ / IRP_MN_NORMAL 1 NTSTATUS Read_MN_NORMAL(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PIO_STACK_LOCATION IrpSp) { NTSTATUS Status = STATUS_SUCCESS; LARGE_INTEGER ByteOffset; ULONG Length; ULONG BytesReaded; IO_STATUS_BLOCK IoStatus; PIMAGE Image; PVOID Buffer; Image = (PIMAGE)DeviceObject->DeviceExtension; if (Image == NULL) { ExKdPrint((" Read_MN_NORMAL, image object is NULL\n")); Irp->IoStatus.Information = 0; return STATUS_INVALID_DEVICE_REQUEST; } // verify parameters ByteOffset.QuadPart = IrpSp->Parameters.Read.ByteOffset.QuadPart; Length = IrpSp->Parameters.Read.Length;...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 24 IRP_MJ_READ / IRP_MN_NORMAL 2... if (ByteOffset.QuadPart + Length > (__int64)Image->ImageSize) { ExKdPrint(("Read_MN_NORMAL invalid offset / length\n")); ExKdPrint(("ByteOffset 0x%I64x Length 0x%x ImageSize 0x%I64x ImageOffset 0x%I64x\n", ByteOffset.QuadPart, Length, Image->ImageSize, Image->ImageOffset)); Irp->IoStatus.Information = 0; return STATUS_INVALID_PARAMETER; } ByteOffset.QuadPart += Image->ImageOffset; Irp->IoStatus.Information = 0; ExKdPrint(("Read_MN_NORMAL Offset %08I64d Length %08ld\n", ByteOffset.QuadPart, Length)); BytesReaded = 0; if (NULL == Image->DiskImage) { ExKdPrint((" no image to read from\n")); Status = STATUS_INVALID_DEVICE_REQUEST; } else...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 25 IRP_MJ_READ / IRP_MN_NORMAL 3... else { if (Irp->MdlAddress != NULL) { ExKdPrint((" try to read disk image, using MDL\n")); Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); Status = ZwReadFile(Image->DiskImage, NULL, NULL, NULL, &IoStatus, Buffer, Length, &ByteOffset, NULL); BytesReaded = (ULONG)IoStatus.Information; ExKdPrint((" read successfully terminated\n")); } else { Status = STATUS_INVALID_PARAMETER; ExKdPrint((" no MDL address\n")); } ExKdPrint((" Read_MN_NORMAL / bytes readed = %ld / status is %s\n", BytesReaded, DrvNtStatusToString(Status))); Irp->IoStatus.Information = BytesReaded; return Status; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 26 Win32 vezérlő alkalmazás – VDCONF 1 int MountVolume(char *image, char *drive, QWORD ImageSize, QWORD ImageOffset) { CHAR DevName[64]; HANDLE Device; MOUNT_IMAGE Mount; int ret; QWORD DiskSize; HANDLE File; // get file size File = CreateFile(image, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (File == INVALID_HANDLE_VALUE) { printf("error: can't open image\n"); return -1; } DiskSize = GetFileSize(File, NULL); CloseHandle(File); // apply predefined file size, if given if (ImageSize != 0) { DiskSize = ImageSize; } else { ImageOffset = 0; }...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 27 Win32 vezérlő alkalmazás – VDCONF 2... // open virtual disk strcpy_s(DevName, sizeof(DevName), "\\\\?\\vdiskdev"); Device = CreateFile(DevName, 0, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if (Device == INVALID_HANDLE_VALUE) { printf("error: can't open virtual disk\n"); return -1; } strcpy_s(Mount.FileName, sizeof(Mount.FileName), image); strcpy_s(Mount.DosDevName, sizeof(Mount.DosDevName), "\\dosdevices\\"); strcat_s(Mount.DosDevName, sizeof(Mount.DosDevName), drive); // disk geometry Mount.DiskGeometry.MediaType = FixedMedia; Mount.DiskGeometry.BytesPerSector = 512; Mount.DiskGeometry.SectorsPerTrack = 63; Mount.DiskGeometry.TracksPerCylinder = 16; Mount.DiskGeometry.Cylinders.QuadPart = DiskSize / (512 * 63 * 16); // set offset and size Mount.ImageOffset = ImageOffset; Mount.ImageSize = DiskSize;...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 28 Win32 vezérlő alkalmazás – VDCONF 3... // partition info Mount.PartInfo.PartitionStyle = PARTITION_STYLE_MBR; Mount.PartInfo.StartingOffset.QuadPart = 0; Mount.PartInfo.PartitionLength.QuadPart = DiskSize; Mount.PartInfo.PartitionNumber = (ULONG)(-1L); Mount.PartInfo.RewritePartition = FALSE; Mount.PartInfo.Mbr.RecognizedPartition = FALSE; // not recognized partition // mount as a read-write disk Mount.ReadOnly = FALSE; Mount.CdRom = FALSE; // mount image if (DeviceIoControl(Device, IOCTL_DRV_MOUNT_IMAGE, &Mount, sizeof(MOUNT_IMAGE), &Mount, sizeof(MOUNT_IMAGE), &ret, NULL)) { printf("image successfully mounted\n"); } else { printf("can't mount image, error: %d\n", GetLastError()); } // close vdisk driver CloseHandle(Device); return Mount.Status; }

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 29 DEMO...

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 30 Mi hiányzik? Plug&Play és Power Management +75% a forráskódra van rá jó példa a Microsoft RamDisk driver-ben valódi volume unmount flush a lemezegységekre FSCTL_DISMOUNT_VOLUME DeviceTree-vel követhető, hogy a most implementált unmount esetén a device objektum megmarad csak letörli a szimbolikus linket és felszabadítja az IMAGE struktúrát CD és DVD képek esetén több session támogatása (több track) több partíciós merevlemez képek támogatása

2006BBTE, Alkalmazások és operációs rendszerek optimizálása 31 Köszönöm a figyelmet!