/** Writes a 16-bit I/O port. Writes the 16-bit I/O port specified by Port with the value specified by Value and returns Value. This function must guarantee that all I/O read and write operations are serialized. If 16-bit I/O port operations are not supported, then ASSERT(). If Port is not aligned on a 16-bit boundary, then ASSERT(). @param Port The I/O port to write. @param Value The value to write to the I/O port. @return The value written to the I/O port. **/ UINT16 EFIAPI IoWrite16 ( IN UINTN Port, IN UINT16 Value ) { ASSERT ((Port & 1) == 0); _ReadWriteBarrier (); _outpw ((UINT16)Port, Value); _ReadWriteBarrier (); return Value; }
bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize) { tagPort32Struct Port32Struct; DWORD dwBytesReturned; if (!IsWinIoInitialized) return false; if (IsNT) { switch (bSize) { case 1: _outp(wPortAddr, dwPortVal); break; case 2: _outpw(wPortAddr, (WORD)dwPortVal); break; case 4: _outpd(wPortAddr, dwPortVal); break; } } else { Port32Struct.bSize = bSize; Port32Struct.dwPortVal = dwPortVal; Port32Struct.wPortAddr = wPortAddr; return DeviceIoControl(hDriver, WINIO_WRITEPORT, &Port32Struct, sizeof(Port32Struct), NULL, 0, &dwBytesReturned, NULL); } return true; }
// ---------------------------------------------------------------------------- void Entry() { // Move cursor off-screen _outpw(0x3D4, 0x070E); _outpw(0x3D4, 0xD00F); CKernelHeader* KH = (CKernelHeader*)CMemMap::c_KernelImageBase; dword* BootInfo = (dword*)(*(dword*)(CMemMap::c_KernelImageBase + 0x100)); RawOutString("Checking Kernel...", 0, 0, 0xA); if (IsKernelOK(*KH, BootInfo)) { RawOutString("OK", 18, 0, 0xA); } else { RawOutString("Fail", 18, 0, 0xC); ErrIf(true); } dword BootType = BootInfo[1]; dword DriversCount = BootInfo[2] - 1; CDriverInfo DriverInfos[12]; for (dword i = 0; i < DriversCount; i++) { DriverInfos[i].m_BytesSize = BootInfo[3 + (i + 1) * 3]; DriverInfos[i].m_LoadPage = BootInfo[4 + (i + 1) * 3]; char* Name = PC(BootInfo[5 + (i + 1) * 3]); for (int j = 0;; j++) { DriverInfos[i].m_Name[j] = Name[j]; if (Name[j] == 0) break; } } InitPIT(); CPhysMemManager PMM; PMM.AllocBlockAt(KH->GetKernelCodeBase(), KH->m_KernelCodePageCount, false); PMM.AllocBlockAt(KH->GetKernelRDataBase(), KH->m_KernelRDataPageCount, false); PMM.AllocBlockAt(KH->GetKernelDataBase(), KH->m_KernelDataPageCount, true); PMM.AllocBlockAt((byte*)CMemMap::c_VideoRamTextBase, 8, true); __writecr3(CMemMap::c_PmmPageDirectory); SetupCR0(); for (dword i = 0; i < DriversCount; i++) { PMM.AllocBlockAt( DriverInfos[i].GetImageBase(), DriverInfos[i].GetImagePageCount(), false); } CGDT GDT(PMM); GDT.CreateNewDescriptor(0, 0xFFFFF, 0x92, 1); GDT.CreateNewDescriptor(0, 0xFFFFF, 0x98, 1); GDT.CreateNewDescriptor(0, 0xFFFFF, 0xF2, 1); GDT.CreateNewDescriptor(0, 0xFFFFF, 0xF8, 1); static const dword HeapPageCount = 32; void* HeapBlock = PMM.AllocBlock(HeapPageCount); CHeap SysHeap(PB(HeapBlock), HeapPageCount * 4096); g_SysHeap = &SysHeap; CTask KernelTask(GDT, true, 0, 0, 0, 0, CMemMap::c_PmmPageDirectory); KernelTask._setActive(); CIntManager IM(PMM, KernelTask.GetTSS().GetSelector()); CKernel K(KernelTask, PMM, IM, GDT, IM.GetIDT(), BootType, DriverInfos, DriversCount); }
void OutPortWord(ushort port, ushort value) { _outpw(port, value); }
unsigned short MSVCRT__outpw( unsigned short port, unsigned short dataword) { return _outpw(port, dataword); }