实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
unit WinIo; interface uses Windows, kol, WinSvc; const DRIVER_NAME_NT='OSCI_DRVNT'; type tMSR = packed record HiPart, LowPart: DWord; end; function CreateDrive: Boolean; function UnLoadDeviceDriver:boolean; function ReadMSRNT(ulECX:DWord; var MSRreg:tmsr):boolean; function WriteMSRNT(ulECX:DWord;MSRreg:tmsr):boolean; function PortDWordInNT(Port : DWord) : DWord; function PortWordInNT(Port : DWord) : Word; function PortInNT(Port : DWord) : Byte; procedure PortDWordOutNT(Port : DWord; Data : DWord); procedure PortWordOutNT(Port : DWord; Data : Word); procedure PortOutNT(Port : DWord; Data : Byte); Procedure GetPCIRDWord( dwBus, dwDev, dwFunc, offs : byte; var pdata:DWord); implementation const METHOD_BUFFERED = 0; METHOD_IN_DIRECT = 1; METHOD_OUT_DIRECT = 2; METHOD_NEITHER = 3; MSR_TYPE = 40000; PCI_TYPE=40000; FILE_ANY_ACCESS = 0; FILE_READ_ACCESS = 1; FILE_WRITE_ACCESS = 2; PCRAddress = $0cf8; PCRData = $0cfc; FILE_NAME_NT='OSCI_DRVNT.sys'; var DriverHandle: THandle; function ExtractRes(FileName: KolString): boolean; var HResInfo:HRSRC; HGlobal :THandle; ASize :integer; S: pStream; begin Result := False; HResInfo := FindResource(hInstance, 'Setup', 'sysfile'); if HResInfo <> 0 then begin HGlobal := LoadResource(hInstance, HResInfo); if HGlobal <> 0 then begin ASize := SizeOfResource(hInstance, HResInfo); S := NewExMemoryStream(LockResource(HGlobal), ASize ); S.SaveToFile(FileName,0, ASize); S.Free; Result := True; end; end; end; function LoadDeviceDriver:boolean; var FileW: PChar; lpBuffer: array[0..255] of Char; DestDir: string; Code: Integer; schSCManager, schService: SC_HANDLE; b: PChar; begin Result := False; b := nil; GetWindowsDirectory(lpBuffer, 255); DestDir := lpBuffer '\System32\Drivers\'; FileW := PChar(DestDir FILE_NAME_NT); Code := GetFileAttributes(FileW); if (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then DeleteFile(FileW); //if Windows.CopyFile(FILE_NAME_NT, FileW, False) then if ExtractRes(FileW) then begin schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if schSCManager <> 0 then begin schService := CreateService(SchSCManager, // SCManager database DRIVER_NAME_NT, // name of service DRIVER_NAME_NT, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_KERNEL_DRIVER, // service type SERVICE_DEMAND_START, // start type SERVICE_ERROR_NORMAL, // error control type FileW, // service's binary nil, // no load ordering group nil, // no tag identifier nil, // no dependencies nil, // LocalSystem account nil // no password ); if SchService <> 0 then begin StartService(schService, 0, b); DriverHandle := CreateFile(PChar('\\.\' DRIVER_NAME_NT), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (DriverHandle <> INVALID_HANDLE_VALUE) and (DriverHandle <> 0); CloseServiceHandle(schService); end; CloseServiceHandle(schSCManager); end; end; end; function UnLoadDeviceDriver:boolean; var schSCManager, schService: SC_HANDLE; ServiceStatus: TServiceStatus; begin schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if schSCManager <> 0 then begin schService := OpenService(SchSCManager, DRIVER_NAME_NT, SERVICE_ALL_ACCESS); if schService <> 0 then begin ControlService(schService, SERVICE_CONTROL_STOP, ServiceStatus); DeleteService(schService); CloseServiceHandle(schService); end; CloseServiceHandle(schSCManager); end; end; function CreateDrive: Boolean; begin UnLoadDeviceDriver; Result := LoadDeviceDriver; end; function CTL_CODE(Device,Funct,Method,Access:word):DWord; begin result:=(Device SHL 16) or (access SHL 14) or (funct SHL 2) or method; end; function ReadMSRNT(ulECX:DWord; var MSRreg:tmsr):boolean; var IOCTL_READ_MSR: longint; ReturnedLength: DWord; IoctlResult: boolean; buf:array[1..2] of DWord; begin IOCTL_READ_MSR := CTL_CODE(MSR_TYPE, $981, METHOD_BUFFERED, FILE_ANY_ACCESS); IoctlResult := DeviceIoControl( DriverHandle, // Handle to device IOCTL_READ_MSR, // RDMSR code @ulECX, // Buffer to driver sizeof(ulECX), // Length of buffer in bytes. @buf, // Buffer from driver. sizeof(buf), // Length of buffer in bytes. ReturnedLength, // Bytes placed in outbuf. nil // ); MSRreg.LowPart:=buf[1]; MSRreg.HiPart:=buf[2]; result := IoctlResult; end; function WriteMSRNT(ulECX:DWord;MSRreg:tmsr):boolean; var IOCTL_WRITE_MSR:longint; ReturnedLength:DWord; IoctlResult:boolean; buf:array[1..3] of DWord; begin buf[1]:=ulECX; buf[2]:=MSRreg.LowPart; buf[3]:=MSRreg.HiPart; IOCTL_WRITE_MSR:=CTL_CODE(MSR_TYPE, $982, METHOD_BUFFERED, FILE_ANY_ACCESS); IoctlResult:=DeviceIoControl( DriverHandle, // Handle to device IOCTL_WRITE_MSR, // WRMSR code @buf, // Buffer to driver sizeof(buf), // Length of buffer in bytes. @result, // Buffer from driver. sizeof(result), // Length of buffer in bytes. ReturnedLength, // Bytes placed in outbuf. nil // nil ); result:=IoctlResult; end; function PortDWordInNT(Port : DWord) : DWord; var IOCTL_PCI_READ_PORT_ULONG:longint; data:DWord; IoctlResult:boolean; ReturnedLength:DWord; begin data:=0; IOCTL_PCI_READ_PORT_ULONG:=CTL_CODE( PCI_TYPE, $902, METHOD_BUFFERED, FILE_READ_ACCESS ); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_READ_PORT_ULONG, @port, sizeof(DWord), @data, sizeof(data), ReturnedLength, nil ); assert(IoctlResult); assert(ReturnedLength=sizeof(data)); result:=data; end; function PortWordInNT(Port : DWord) : Word; var IOCTL_PCI_READ_PORT_USHORT:longint; data:Word; IoctlResult:boolean; ReturnedLength:DWord; begin data:=0; IOCTL_PCI_READ_PORT_USHORT:=CTL_CODE( PCI_TYPE, $901, METHOD_BUFFERED, FILE_READ_ACCESS ); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_READ_PORT_USHORT, @port, sizeof(DWord), @data, sizeof(data), ReturnedLength, nil ); assert(IoctlResult); assert(ReturnedLength=sizeof(data)); result:=data; end; function PortInNT(Port : DWord) : Byte; var IOCTL_PCI_READ_PORT_UCHAR:longint; data:byte; IoctlResult:boolean; ReturnedLength:DWord; begin data:=0; IOCTL_PCI_READ_PORT_UCHAR:=CTL_CODE( PCI_TYPE, $900, METHOD_BUFFERED, FILE_READ_ACCESS ); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_READ_PORT_UCHAR, @Port, sizeof(DWord), @data, sizeof(data), ReturnedLength, nil ); assert(IoctlResult); assert(ReturnedLength=sizeof(data)); result:=data; end; procedure PortDWordOutNT(Port : DWord; Data : DWord); type TPCIInputBuffer=packed record PortNumber:DWord; DWordData:DWord; end; var IOCTL_PCI_WRITE_PORT_ULONG:longint; IoctlResult:boolean; ReturnedLength:DWord; DataLength:DWord; PCIInputBuffer:TPCIInputBuffer; begin IOCTL_PCI_WRITE_PORT_ULONG:=CTL_CODE(PCI_TYPE, $912, METHOD_BUFFERED, FILE_WRITE_ACCESS); PCIInputBuffer.DWordData:=data; PCIInputBuffer.PortNumber:=port; DataLength:=32 sizeof(PCIInputBuffer.DWordData); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_WRITE_PORT_ULONG, @PCIInputBuffer, DataLength, nil, 0, ReturnedLength, nil ); assert(IoctlResult); end; procedure PortWordOutNT(Port : DWord; Data : Word); type TPCIInputBuffer=packed record PortNumber:DWord; WordData:Word; end; var IOCTL_PCI_WRITE_PORT_USHORT:longint; IoctlResult:boolean; ReturnedLength:DWord; DataLength:DWord; PCIInputBuffer:TPCIInputBuffer; begin IOCTL_PCI_WRITE_PORT_USHORT:=CTL_CODE(PCI_TYPE, $911, METHOD_BUFFERED, FILE_WRITE_ACCESS); PCIInputBuffer.WordData:=data; PCIInputBuffer.PortNumber:=port; DataLength:=32 sizeof(PCIInputBuffer.WordData); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_WRITE_PORT_USHORT, @PCIInputBuffer, DataLength, nil, 0, ReturnedLength, nil ); assert(IoctlResult); end; procedure PortOutNT(Port : DWord; Data : Byte); type TPCIInputBuffer=packed record PortNumber:DWord; CharData:byte; end; var IOCTL_PCI_WRITE_PORT_UCHAR:longint; IoctlResult:boolean; ReturnedLength:DWord; DataLength:DWord; PCIInputBuffer:TPCIInputBuffer; begin IOCTL_PCI_WRITE_PORT_UCHAR:=CTL_CODE(PCI_TYPE, $910, METHOD_BUFFERED, FILE_WRITE_ACCESS); PCIInputBuffer.CharData:=data; PCIInputBuffer.PortNumber:=port; DataLength:=32 sizeof(PCIInputBuffer.CharData); IoctlResult:=DeviceIoControl( DriverHandle, IOCTL_PCI_WRITE_PORT_UCHAR, @PCIInputBuffer, DataLength, nil, 0, ReturnedLength, nil ); assert(IoctlResult); end; Procedure GetPCIRDWord( dwBus, dwDev, dwFunc, offs : byte; var pdata:DWord); var Data: Cardinal; begin Data := $80000000 or (longint(dwBus) shl 16) or ((longint(dwDev) and $1f) shl 11) or ((longint(dwFunc) and $07 ) shl 8) or (offs and $fc); PortDWordOutNT(PCRAddress, Data); pData := PortDWOrdInNT(PCRData); end; end.
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论