#if 1 // The following includes are used when building with the microsoft internal build tree. #include #include #include #include #else // These headers are used when building with the microsoft DDK. #include #include #include #endif #include #include #include #include #include #include BOOLEAN NibcDetInit( IN HANDLE hModule, IN DWORD dwReason, IN DWORD dwReserved ) /*++ Routine Description: This routine is the entry point into the detection dll. This routine only return "TRUE". ++*/ { return (TRUE); } ULONG NibcNextIoAddress( IN ULONG IoBaseAddress ) /*++ Routine Description: This routine provide next I/O address for detect PC-9801-83/84/103/104. ++*/ { switch(IoBaseAddress){ case 0x0888: return (0x1888); case 0x1888: return (0x2888); case 0x2888: return (0x3888); default: return (0xffff); } } NTSTATUS FindNibcAdapter( OUT PMND_ADAPTER_INFO *pDetectedAdapter, IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN ULONG IoBaseAddress, IN PWSTR pPnpId ) { NTSTATUS NtStatus; UCHAR Data; USHORT CheckSum = 0; USHORT StoredCheckSum; UINT Place; UCHAR Interrupt = 0; HANDLE TrapHandle; UCHAR InterruptList[8]; UCHAR ResultList[8] = {0}; UINT cResources; UINT c; UCHAR Value; ULONG MemoryBaseAddress = 0; do{ // check I/O port range. NtStatus = NDetCheckPortUsage(InterfaceType, BusNumber, IoBaseAddress, 0x4); if(!NT_SUCCESS(NtStatus)){ #if DBG DbgPrint("FindNibcAdapter : Port range in use. IoBaseAddress = %x\n", IoBaseAddress); #endif break; } // check board ID. // 83/84's ID is 0x05. NDetWritePortUchar(InterfaceType, BusNumber, IoBaseAddress + 0x003, 0x88); NDetReadPortUchar(InterfaceType, BusNumber, IoBaseAddress + 0x001, &Value); if(Value != 0x05){ NtStatus = STATUS_NOT_FOUND; #if DBG DbgPrint("ID is invalid. ID = %x\n",Value); #endif break; } // check interrupt. InterruptList[0] = 3; InterruptList[1] = 5; InterruptList[2] = 6; InterruptList[3] = 9; InterruptList[4] = 10; InterruptList[5] = 12; InterruptList[6] = 13; NtStatus = NDetSetInterruptTrap(InterfaceType, BusNumber, &TrapHandle, InterruptList, 7); if(NT_SUCCESS(NtStatus)){ NtStatus = NDetQueryInterruptTrap(TrapHandle, ResultList, 7); NtStatus = NDetRemoveInterruptTrap(TrapHandle); if(!NT_SUCCESS(NtStatus)){ #if DBG DbgPrint("NDetRemoveInterruptTrap failed. Status = %x\n",NtStatus); #endif break; } for(c=0 ; c<7 ; c++){ if((ResultList[c] == 1) || (ResultList[c] == 2)){ Interrupt = InterruptList[c]; break; } } }else{ #if DBG DbgPrint("NDetSetInterruptTrap failed. Status = %x\n",NtStatus); #endif } for(c=0 ; c<16 ; c++){ MemoryBaseAddress = 0xc0000 + (0x2000 * c); if(MemoryBaseAddress == 0xd0000){ continue; } NtStatus = NDetCheckMemoryUsage( InterfaceType, BusNumber, MemoryBaseAddress, 0x2000); if (NT_SUCCESS(NtStatus)) { #if DBG DbgPrint("NDetCheckMemoryUsage success. Address = %x\n",MemoryBaseAddress); #endif break; } } // Allocate the adapter information. NtStatus = NetDetectAllocAdapterInfo(pDetectedAdapter, InterfaceType, BusNumber, pPnpId, 0, 0, 0, 2); if (!NT_SUCCESS(NtStatus)){ #if DBG DbgPrint("NetDetectAllocAdapterInfo failed. Status = %x\n",NtStatus); #endif break; } #if DBG DbgPrint("IoBaseAddress = %x\n",IoBaseAddress); DbgPrint("Interrupt = %x\n",Interrupt); DbgPrint("MemoryAddress = %x\n",MemoryBaseAddress); #endif // Initialize the resources. NetDetectInitializeResource(*pDetectedAdapter, 0, MndResourcePort, IoBaseAddress, 0x4); if(Interrupt != 0){ NetDetectInitializeResource(*pDetectedAdapter, 1, MndResourceInterrupt, Interrupt, MND_RESOURCE_INTERRUPT_LATCHED); } if(MemoryBaseAddress != 0){ NetDetectInitializeResource(*pDetectedAdapter, 1, MndResourceMemory, MemoryBaseAddress, 0x2000); } NtStatus = STATUS_SUCCESS; }while(FALSE); return (NtStatus); } NTSTATUS WINAPI FindAdapterHandler( IN OUT PMND_ADAPTER_INFO *pDetectedAdapter, IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PDET_ADAPTER_INFO pAdapterInfo, IN PDET_CONTEXT pDetContext ) /*++ Routine Description: Arguments: Return Value: --*/ { NTSTATUS NtStatus; ULONG IoBaseAddress; if(InterfaceType != Isa){ return(STATUS_INVALID_PARAMETER); } // Are we looking for the first adapter? if (fDET_CONTEXT_FIND_FIRST == (pDetContext->Flags & fDET_CONTEXT_FIND_FIRST)){ // Initialize the context information so that we start detecting // at the initialize port range. pDetContext->ISA.IoBaseAddress = 0x0888; } for (IoBaseAddress = pDetContext->ISA.IoBaseAddress; IoBaseAddress <= 0x3888; IoBaseAddress = NibcNextIoAddress(IoBaseAddress)){ // Look for the PC-9801-83/84/103/104 adapter at the current port. NtStatus = FindNibcAdapter(pDetectedAdapter, InterfaceType, BusNumber, IoBaseAddress, pAdapterInfo->PnPId); if (NT_SUCCESS(NtStatus)){ // We found an adapter. Save the next IO address to check. #if DBG DbgPrint("Found an adapter. I/O port is %x\n",IoBaseAddress); #endif pDetContext->ISA.IoBaseAddress = NibcNextIoAddress(IoBaseAddress); break; } } if (0xffff == IoBaseAddress){ NtStatus = STATUS_NO_MORE_ENTRIES; } return(NtStatus); }