NTSTATUS NTAPI KdpPortInitialize(IN ULONG ComPortNumber, IN ULONG ComPortBaudRate) { NTSTATUS Status; KDDBGPRINT("KdpPortInitialize, Port = COM%ld\n", ComPortNumber); Status = CpInitialize(&KdDebugComPort, UlongToPtr(BaseArray[ComPortNumber]), ComPortBaudRate); if (!NT_SUCCESS(Status)) { return STATUS_INVALID_PARAMETER; } else { KdComPortInUse = KdDebugComPort.Address; return STATUS_SUCCESS; } }
BOOLEAN WinLdrPortInitialize(IN ULONG BaudRate, IN ULONG PortNumber, IN PUCHAR PortAddress, IN BOOLEAN TerminalConnected, OUT PULONG PortId) { /* Set default baud rate */ if (BaudRate == 0) BaudRate = 19200; /* Check if port or address given */ if (PortNumber) { /* Pick correct address for port */ if (!PortAddress) { switch (PortNumber) { case 1: PortAddress = (PUCHAR)0x3F8; break; case 2: PortAddress = (PUCHAR)0x2F8; break; case 3: PortAddress = (PUCHAR)0x3E8; break; default: PortNumber = 4; PortAddress = (PUCHAR)0x2E8; } } } else { /* Pick correct port for address */ PortAddress = (PUCHAR)0x2F8; if (CpDoesPortExist(PortAddress)) { PortNumber = 2; } else { PortAddress = (PUCHAR)0x3F8; if (!CpDoesPortExist(PortAddress)) return FALSE; PortNumber = 1; } } /* Not yet supported */ ASSERT(LoaderRedirectionInformation.IsMMIODevice == FALSE); /* Check if port exists */ if ((CpDoesPortExist(PortAddress)) || (CpDoesPortExist(PortAddress))) { /* Initialize port for first time, or re-initialize if specified */ if (((TerminalConnected) && (Port[PortNumber - 1].Address)) || !(Port[PortNumber - 1].Address)) { /* Initialize the port, return it */ CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate); *PortId = PortNumber - 1; return TRUE; } } return FALSE; }
BOOLEAN NTAPI KdPortInitializeEx( IN PCPPORT PortInformation, IN ULONG ComPortNumber) { NTSTATUS Status; CHAR buffer[80]; #if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use KdPortInitializeEx) /* * Find the port if needed */ SIZE_T i; if (!PortInitialized) { DefaultPort.BaudRate = PortInformation->BaudRate; if (ComPortNumber == 0) { /* * Start enumerating COM ports from the last one to the first one, * and break when we find a valid port. * If we reach the first element of the list, the invalid COM port, * then it means that no valid port was found. */ for (i = sizeof(BaseArray) / sizeof(BaseArray[0]) - 1; i > 0; i--) { if (CpDoesPortExist(UlongToPtr(BaseArray[i]))) { PortInformation->Address = DefaultPort.Address = BaseArray[i]; ComPortNumber = (ULONG)i; break; } } if (ComPortNumber == 0) { sprintf(buffer, "\nKernel Debugger: No COM port found!\n\n"); HalDisplayString(buffer); return FALSE; } } PortInitialized = TRUE; } #endif /* * Initialize the port */ Status = CpInitialize(PortInformation, (ComPortNumber == 0 ? PortInformation->Address : UlongToPtr(BaseArray[ComPortNumber])), (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE : PortInformation->BaudRate)); if (!NT_SUCCESS(Status)) { sprintf(buffer, "\nKernel Debugger: Serial port not found!\n\n"); HalDisplayString(buffer); return FALSE; } else { #ifndef NDEBUG /* Print message to blue screen */ sprintf(buffer, "\nKernel Debugger: Serial port found: COM%ld (Port 0x%lx) BaudRate %ld\n\n", ComPortNumber, PortInformation->Address, PortInformation->BaudRate); HalDisplayString(buffer); #endif /* NDEBUG */ #if 0 /* Set global info */ KdComPortInUse = DefaultPort.Address; #endif return TRUE; } }
// // initialize port // BOOLEAN BlPortInitialize(__in ULONG Baudrate,__in ULONG PortNum,__in ULONG PortAddr,__in BOOLEAN ReInitialize,__out PULONG DeviceId) { // // set default baudrate if caller did not give us // if(!Baudrate) Baudrate = 19200; // // setup function pointers // if(LoaderRedirectionInfo.MemorySpace) { READ_UCHAR = &READ_REGISTER_UCHAR; WRITE_UCHAR = &WRITE_REGISTER_UCHAR; } else { READ_UCHAR = &READ_PORT_UCHAR; WRITE_UCHAR = &WRITE_PORT_UCHAR; } if(!PortNum) { // // try COM1,COM2 with default value // PortAddr = 0x3f8; PortNum = 2; if(CpDoesPortExist(reinterpret_cast<PUCHAR>(0x2f8))) PortAddr = 0x2f8; else if(CpDoesPortExist(reinterpret_cast<PUCHAR>(0x3f8))) PortNum = 3; else return FALSE; } else if(!PortAddr) { switch(PortNum) { case 1: PortAddr = 0x3f8; break; case 2: PortAddr = 0x2f8; break; case 3: PortAddr = 0x3e8; break; default: PortAddr = 0x2e8; PortNum = 4; break; } } PUCHAR BaseAddress = 0; if(LoaderRedirectionInfo.MemorySpace) { // // map registers // PHYSICAL_ADDRESS Address; Address.QuadPart = PortAddr; BaseAddress = static_cast<PUCHAR>(MmMapIoSpace(Address,7,MmNonCached)); } else { BaseAddress = reinterpret_cast<PUCHAR>(PortAddr); } // // if base address is a memory mapped register,WHY? // if(!CpDoesPortExist(BaseAddress) && !LoaderRedirectionInfo.MemorySpace) return FALSE; // // for reinitialize request,port object's base address must not be zero // otherwise port object's base address must be zero // if(ReInitialize == !Port[PortNum - 1].Address) return FALSE; CpInitialize(Port + PortNum - 1,BaseAddress,Baudrate); // // device id is port number - 1 // *DeviceId = PortNum - 1; return TRUE; }
BOOLEAN NTAPI InbvPortInitialize(IN ULONG BaudRate, IN ULONG PortNumber, IN PUCHAR PortAddress, OUT PULONG PortId, IN BOOLEAN IsMMIODevice) { /* Not yet supported */ ASSERT(IsMMIODevice == FALSE); /* Set default baud rate */ if (BaudRate == 0) BaudRate = 19200; /* Check if port or address given */ if (PortNumber) { /* Pick correct address for port */ if (!PortAddress) { switch (PortNumber) { case 1: PortAddress = (PUCHAR)0x3F8; break; case 2: PortAddress = (PUCHAR)0x2F8; break; case 3: PortAddress = (PUCHAR)0x3E8; break; default: PortNumber = 4; PortAddress = (PUCHAR)0x2E8; } } } else { /* Pick correct port for address */ PortAddress = (PUCHAR)0x2F8; if (CpDoesPortExist(PortAddress)) { PortNumber = 2; } else { PortAddress = (PUCHAR)0x3F8; if (!CpDoesPortExist(PortAddress)) return FALSE; PortNumber = 1; } } /* Initialize the port unless it's already up, and then return it */ if (Port[PortNumber - 1].Address) return FALSE; CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate); *PortId = PortNumber - 1; return TRUE; }