Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <windows.h>
- #include "WinIoCtl.h"
- // WinRing0
- #define IOCTL_READ_IO_PORT_BYTE CTL_CODE(40000, 0x833, METHOD_BUFFERED, FILE_READ_ACCESS)
- #define IOCTL_WRITE_IO_PORT_BYTE CTL_CODE(40000, 0x836, METHOD_BUFFERED, FILE_WRITE_ACCESS)
- #define SERVICE_PERMISS (SC_MANAGER_CREATE_SERVICE | SERVICE_START | SERVICE_STOP | DELETE | SERVICE_CHANGE_CONFIG)
- // for WinRing0:
- struct WRITE_IO_PORT_INPUT
- {
- ULONG PortNumber;
- UCHAR CharData;
- };
- HANDLE HDriver = 0;
- const WORD AddrReg_6180 = 0x2E;
- const WORD DataReg_6180 = 0x2F;
- DWORD WriteIoPortByte(WORD u16_Port, BYTE u8_Value)
- {
- // Write a Byte to an I/O Port via Driver
- DWORD u32_RetLen;
- WRITE_IO_PORT_INPUT k_In;
- k_In.CharData = u8_Value;
- k_In.PortNumber = u16_Port;
- if (!DeviceIoControl(HDriver, IOCTL_WRITE_IO_PORT_BYTE, &k_In, sizeof(k_In),
- NULL, 0, &u32_RetLen, NULL))
- return GetLastError();
- return 0;
- }
- DWORD ReadIoPortByte(WORD u16_Port, BYTE* pu8_Value)
- {
- // Read a Byte from an I/O Port via Driver
- DWORD u32_RetLen;
- WORD u16_Value;
- if (!DeviceIoControl(HDriver, IOCTL_READ_IO_PORT_BYTE, &u16_Port, sizeof(u16_Port),
- &u16_Value, sizeof(u16_Value), &u32_RetLen, NULL))
- return GetLastError();
- *pu8_Value = (BYTE) u16_Value;
- return 0;
- }
- BYTE ReadReg(DWORD Reg)
- {
- BYTE Tmp;
- WriteIoPortByte(AddrReg_6180, Reg);
- ReadIoPortByte(DataReg_6180, &Tmp);
- return Tmp;
- }
- void WriteReg(DWORD Reg, BYTE Data)
- {
- WriteIoPortByte(AddrReg_6180, Reg);
- WriteIoPortByte(DataReg_6180, Data);
- }
- int main(int argc, char**argv)
- {
- LPTSTR DriverName= L"WinRing0";
- LPTSTR DriverFile = L"%SystemRoot%\\system32\\drivers\\WinRing0.sys";
- LPTSTR DriverID = L"\\\\.\\WinRing0_1_2_0";
- if (argc != 2)
- {
- puts("You should specify WD timer in seconds");
- return 1;
- }
- int val = atoi(argv[1]);
- if (val<0 || val>255)
- {
- puts("WD timer should be between 0 (off) and 255");
- return 1;
- }
- HDriver = CreateFile(DriverID, GENERIC_READ | GENERIC_WRITE, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (HDriver == INVALID_HANDLE_VALUE)
- {
- SC_HANDLE h_SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
- if (!h_SCManager)
- {
- puts("Not an admin");
- return GetLastError();
- }
- DWORD u32_Err = 0;
- SC_HANDLE h_Service = CreateService(h_SCManager, DriverName, DriverName,
- SERVICE_PERMISS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
- DriverFile, NULL, NULL, NULL, NULL, NULL);
- if (!h_Service)
- h_Service = OpenService(h_SCManager, DriverName, SERVICE_PERMISS);
- if (!h_Service)
- puts("Unable to install service. You need to copy WinRing0.sys to system32\drivers.");
- if (!StartService(h_Service, 0, NULL))
- u32_Err = GetLastError();
- if (u32_Err == ERROR_SERVICE_ALREADY_RUNNING) // 1056
- u32_Err = 0;
- CloseServiceHandle(h_Service);
- CloseServiceHandle(h_SCManager);
- HDriver = CreateFile(DriverID, GENERIC_READ | GENERIC_WRITE, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (HDriver == INVALID_HANDLE_VALUE)
- {
- printf("Unable to open driver %d\n",GetLastError());
- return -1;
- }
- }
- WriteIoPortByte(AddrReg_6180, 0x87);
- WriteIoPortByte(AddrReg_6180, 0x87);
- WriteReg(0x7, 0x00);
- printf("Chip ID = %02X%02X\n", ReadReg(0x20), ReadReg(0x21));
- printf("Watchdog was enabled = %s\n", ReadReg(0x2D)&1?"no":"yes");
- WriteReg(0x2d, ReadReg(0x2D)&~1); // enable WD
- WriteReg(0x7, 0x08);
- WriteReg(0x30, 1); // enable WDTO#
- WriteReg(0xF5, 2); // WD in 1 second units via KBRST
- printf("Watchdog ticks were = %d sec\n", ReadReg(0xF6));
- WriteReg(0xF6,val); // set timer
- WriteIoPortByte(AddrReg_6180, 0xAA);
- return 0;
- }
Add Comment
Please, Sign In to add comment