void Socket::ProcessRead(void) { char buf[1024]; unsigned readBytes; systemRead(buf, sizeof(buf), readBytes); #if 0 m_lock->Retain(); #endif concatBuffers(buf, readBytes, m_readBuf, m_readBufSize, m_readBufAllocSize); #if 0 m_lock->Release(); #endif }
// 这是我们自己处理IRP_MJ_READ的方法 NTSTATUS myRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { // 判断是不是我们的设备 if(DeviceObject == gDeviceObject){ // NTSTATUS status = STATUS_SUCCESS; // // 这里做处理,要把一些数据填充到IRP中的数据缓冲区中 // // 直接返回 return status; } // 不要忘了系统过程 return systemRead(DeviceObject, Irp); }
bool neoSystemOpen(const char* szFileName) { TNeoRomHeader header; int rom; u32 bit; ASSERT(g_neo->cpuClockDivide == 2 || g_neo->cpuClockDivide == 3); guiConsoleLogf("Loading %s...", szFileName); guiConsoleDump(); rom = systemOpen(szFileName, false); ASSERTMSG(g_neo->cpuClockDivide == 2 || g_neo->cpuClockDivide == 3, "%d", g_neo->cpuClockDivide); if(rom < 0) { guiConsoleLogf(" -> Failed!"); ASSERT(0); return false; } systemRead(rom, &header, sizeof(TNeoRomHeader)); if(header.magic != NEO_ROM_MAGIC || header.version != NEO_ROM_VERSION || header.sectionCount != NEOROM_COUNT) { systemClose(rom); guiConsoleLogf(" -> invalid rom"); guiConsoleLogf(" -> magic %08X / %08X", header.magic, NEO_ROM_MAGIC); guiConsoleLogf(" -> version %d / %d", header.version, NEO_ROM_VERSION); guiConsoleLogf(" -> section %d / %d", header.sectionCount, NEOROM_COUNT); ASSERT(0); return false; } neoSystemClose(); g_romSize = systemFileSize(rom) - NEO_HEADER_SIZE; g_header = header; g_rom = rom; linearHeapReset(&g_vramHHeap); linearHeapClear(&g_vramHHeap); g_neo->scanline = 0; g_neo->frameCount = 0; g_neo->irqPending = 0; g_neo->paletteBank = 0; g_neo->fixedBank = 0; g_neo->sramProtectCount = 0; g_neo->debug = true; g_neo->irqVectorLatch = false; g_neo->screenDarkLatch = false; g_neo->fixedRomLatch = false; g_neo->sramProtectLatch = false; g_neo->paletteRamLatch = false; g_neo->smaRand = 0x2345; NEOIPC->audioCommandPending = 0; NEOIPC->audioResult = 0; //sram hack gets around watchdog protection check...values taken from GnGeo //added samsho5 variations g_neo->sramProtection = g_header.sramProtection; guiConsoleLogf("Loaded Game: %s", g_header.name); g_neo->spriteCount = g_header.romEntry[NEOROM_SPRITEDATA].size / SPRITE_SIZE; g_neo->spriteMask = 0xffffffff; for(bit = 0x80000000; bit != 0; bit >>= 1) { if((g_neo->spriteCount - 1) & bit) break; g_neo->spriteMask >>= 1; } g_neo->romBankCount = 0; const s32 bankSize = (s32)g_header.romEntry[NEOROM_MAINPROGRAM].size - 1*MB; if(bankSize > 0) { g_neo->romBankCount = bankSize / (1*MB); if(g_neo->romBankCount * 1*MB != bankSize) { g_neo->romBankCount++; guiConsoleLogf(" -> partial rom bank"); } } guiConsoleLogf(" -> sprites: %d", g_neo->spriteCount); guiConsoleLogf(" -> mask: %08X", g_neo->spriteMask); guiConsoleLogf(" -> rom bank(s): %d", g_neo->romBankCount); if(g_neo->sramProtection == -1) { guiConsoleLogf(" -> sramProtection off"); } else { guiConsoleLogf(" -> sramProtection: %08X", g_neo->sramProtection); } guiConsoleDump(); systemRamReset(); cpuInit(); neoMemoryInit(); neoIOInit(); pd4990a_init(); neoVideoInit(); neoInstallProtection(); //neoSystemIrq(INTR_COLDBOOT); if(NEOIPC->globalAudioEnabled) { neoAudioStreamInit(); neoIPCSendCommand(NEOARM7_RESET); } else { //this is the value that needs to be set to bypass Z80 check NEOIPC->audioResult = 1; } cpuReset(); neoLoadConfig(szFileName); neoResetContext(); ASSERTMSG(g_neo->cpuClockDivide == 2 || g_neo->cpuClockDivide == 3, "%d", g_neo->cpuClockDivide); return true; }