⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 WinCE5.0部分核心源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                FILESentry* pfe = (FILESentry*) pBuffer;
                DWORD i, j;
                
                for (i=0;i < dwNumFiles; i++) {
                    fRet = ReadAtOffset(pVolume, (PBYTE) szAscii,  MAX_PATH, &dwRead, AdjustOffset( pVolume, dwCurRegion , (DWORD) pfe[i].lpszFileName));
                    j = 0;
                    memset( szFileName, 0, MAX_PATH);
                    while( (j < MAX_PATH) && szAscii[j]) {
                        szFileName[j] = szAscii[j];
                        j++;
                    }   
                    pTemp = new BinDirList;
                    if (pTemp) {
                        pTemp->dwRegion = dwCurRegion;
                        pTemp->dwAddress = AdjustOffset( pVolume, dwCurRegion, pfe[i].ulLoadOffset);
                        pTemp->dwCompFileSize = pfe[i].nCompFileSize;
                        pTemp->dwRealFileSize = pfe[i].nRealFileSize;
                        pTemp->dwAttributes = pfe[i].dwFileAttributes | FILE_ATTRIBUTE_INROM;
                        pTemp->pe32 = NULL;
                        pTemp->po32 = NULL;
                        memcpy( &pTemp->ft, &(pfe[i].ftTime), sizeof(FILETIME)); 
                        pTemp->szFileName = new WCHAR[wcslen(szFileName)+1];
                        if (pTemp->szFileName) {
                            wcscpy( pTemp->szFileName, szFileName);
                        }
                        pTemp->pNext = NULL;
                        if (pDirectory) {
                            pDirectory->pNext = pTemp;
                        } else {
                            pVolume->pChain[dwCurRegion].pDirectory = pTemp;
                        }
                        pDirectory = pTemp;
                    }
                }
            } else {
                DEBUGMSG( ZONE_INIT, (L"BINFS: InitVolume - Couldn't locate Files data\n"));
            }
            delete [] pBuffer;
        }    
    }    
    PRINTFILELISTING( pVolume->pChain[dwCurRegion].pDirectory);
    pVolume->pChain[dwCurRegion].pDirectoryLast = pDirectory;
    return TRUE;
}

BOOL FindRegion(BinVolume *pVolume, DWORD dwHdrStart, LPDWORD pdwRegion) 
{
    DWORD dwRegion = 0;
    for (dwRegion = 0; dwRegion < pVolume->dwNumRegions; dwRegion++) {
        if ((dwHdrStart >= pVolume->pChain[dwRegion].dwAddress) && (dwHdrStart <= (pVolume->pChain[dwRegion].dwAddress + pVolume->pChain[dwRegion].dwLength))) {
            *pdwRegion = dwRegion;
            return TRUE;
        }
    }
    return FALSE;
}

BOOL InitVolume(BinVolume *pVolume)
{
    DWORD dwOffset = 0;
    DWORD dwSignature, dwHdrStart, dwRead;
    DWORD dwRomHdrOffset;
    BinDirList *pDirectory = NULL;
    DWORD dwRegion, dwCurRegion;
    ROMINFO *pInfo;
    DWORD  cbSize = sizeof(ROMINFO)+(sizeof(LARGE_INTEGER)*pVolume->dwNumRegions);
    pInfo = (ROMINFO *)new BYTE[cbSize];
    pInfo->dwSlot_0_DllBase = 0x02000000;
    pInfo->dwSlot_1_DllBase = 0x04000000;
    pInfo->nROMs = pVolume->dwNumRegions;
    LARGE_INTEGER *pHiLowPair = (LARGE_INTEGER *)(((BYTE *)pInfo)+sizeof(ROMINFO));
    if (pInfo) {
        for (dwRegion = 0; dwRegion < pVolume->dwNumRegions; dwRegion++) {
skipchain:        
            if (!ReadAtOffset(pVolume, &dwSignature, sizeof(DWORD), &dwRead, ROM_SIGNATURE_OFFSET+dwOffset)) {
                break;
            }    
            if (dwSignature != ROM_SIGNATURE) {
                DEBUGMSG( ZONE_INIT, (TEXT("BINFS: InitVolume - Signature of ROM Header does not Match- Assuming Chain Region")));
                dwOffset += g_dwChainRegionLength;
                goto skipchain;
            } 
            ReadAtOffset(pVolume, &dwHdrStart, sizeof(DWORD), &dwRead, ROM_SIGNATURE_OFFSET+sizeof(DWORD)+dwOffset);
            if (!FindRegion( pVolume, dwHdrStart, &dwCurRegion)) {
                DEBUGCHK(0);
                return FALSE;
            }
            pVolume->pChain[dwCurRegion].dwBinOffset = dwOffset;
            dwRomHdrOffset = AdjustOffset( pVolume, dwCurRegion, dwHdrStart);
            DEBUGMSG( ZONE_INIT, (TEXT("BINFS: InitVolume - RomHdr starts at %08X(%08X)\r\n"), dwHdrStart, dwRomHdrOffset));
            if (pVolume->pChain[dwCurRegion].dwType == CHAIN_TYPE_BIN) {
                if (!ReadDirEntries(pVolume, dwCurRegion, dwRomHdrOffset)) {
                    // TODO: Do we continue or do we stop ???
                    DEBUGMSG( ZONE_INIT, (L"Failed reading directory entries for phys region %ld , logical region %ld\r\n", dwRegion, dwCurRegion));
                    return FALSE;
                }    
            }
            dwOffset += pVolume->pChain[dwCurRegion].dwLength;
        }
    } else {
        return FALSE;
    }    
    DEBUGMSG( ZONE_INIT, (TEXT("BINFS: Num Regions = %ld  Slot0Base=0x%08x Slot1Base=0x%08x\r\n"), pInfo->nROMs, pInfo->dwSlot_0_DllBase, pInfo->dwSlot_1_DllBase));
    for (dwRegion = 0; dwRegion < pVolume->dwNumRegions; dwRegion++) {
        if (pVolume->pChain[dwRegion].dwSlot1DllBase < pInfo->dwSlot_1_DllBase)
            pInfo->dwSlot_1_DllBase = pVolume->pChain[dwRegion].dwSlot1DllBase;
        if (( pVolume->pChain[dwRegion].Toc.dllfirst & 0xffff0000)  <  pInfo->dwSlot_0_DllBase){
            pInfo->dwSlot_0_DllBase = pVolume->pChain[dwRegion].Toc.dllfirst & 0xffff0000;
        }
#ifdef DEBUG        
        if (dwRegion && 
            (pVolume->pChain[dwRegion].dwType == CHAIN_TYPE_BIN) && 
            (pVolume->pChain[dwRegion-1].dwType == CHAIN_TYPE_BIN)) 
        {
            if ((pVolume->pChain[dwRegion].Toc.dllfirst > pVolume->pChain[dwRegion-1].Toc.dllfirst) && 
                 (pVolume->pChain[dwRegion].Toc.dlllast < pVolume->pChain[dwRegion-1].Toc.dlllast)) {
                    // We have overlapping bin regions;
                    DEBUGMSG( 1, (L"BINFS:We have overlapping regions between region %ld and %ld...aborting\r\n",dwRegion-1, dwRegion));
                    return FALSE;
            }
            if ((pVolume->pChain[dwRegion].Toc.dlllast > pVolume->pChain[dwRegion-1].Toc.dlllast) && 
                 (pVolume->pChain[dwRegion].Toc.dllfirst < pVolume->pChain[dwRegion-1].Toc.dllfirst)) {
                    // We have overlapping bin regions;
                    DEBUGMSG( 1, (L"BINFS:We have overlapping regions between region %ld and %ld...aborting\r\n", dwRegion-1, dwRegion));
                    return FALSE;
            }
        }
#endif        
        pHiLowPair->LowPart = ((pVolume->pChain[dwRegion].Toc.dllfirst & 0xffff) << 16);
        pHiLowPair->HighPart = pVolume->pChain[dwRegion].Toc.dlllast;
        DEBUGMSG( ZONE_INIT, (TEXT("BINFS:     Region %ld: High=0x%08x  Low=0x%08x\r\n"), dwRegion, pHiLowPair->HighPart, pHiLowPair->LowPart));
        if (pVolume->pChain[dwRegion].dwType == CHAIN_TYPE_BIN) {
            if (pDirectory = (BinDirList *)pVolume->pChain[dwRegion].pDirectoryLast) {
                pDirectory->pNext = pVolume->pDirectory;
            }    
            if (pDirectory = (BinDirList *)pVolume->pChain[dwRegion].pDirectory) {
                pVolume->pDirectory = pDirectory;
            }
        }
        pHiLowPair++;
    }
    if (!KernelLibIoControl( (HANDLE)KMOD_CORE, IOCTL_KLIB_SETROMDLLBASE, pInfo, cbSize, NULL, 0, NULL)) {
        NKDbgPrintfW( L"IOCTL_KLIB_SETROMDLLBASE failed !!!");
        DEBUGCHK(0);
        return FALSE;
    }
    
    PRINTFILELISTING( pVolume->pDirectory);
    return TRUE;
}

BOOL RegisterVolume(BinVolume *pVolume)
{
    TCHAR szFolderName[MAX_PATH];    
    DWORD cbRet;
    STORAGEDEVICEINFO sdi;
    if (!FSDMGR_GetRegistryString(pVolume->hDsk, L"Folder", szFolderName, MAX_PATH)) {
        wcscpy( szFolderName, DEFAULT_VOLUME_NAME);
    }    
    if ((UserKInfo[KINX_PAGESIZE] == pVolume->diskInfo.di_bytes_per_sect)
        && FSDMGR_DiskIoControl(pVolume->hDsk, IOCTL_DISK_DEVICE_INFO, &sdi, sizeof(sdi), NULL, 0, &cbRet, NULL)) {
        // if the sector size == the page size and the block device supports XIP, support XIP modules
        if (STORAGE_DEVICE_FLAG_XIP & sdi.dwDeviceFlags) {
            pVolume->dwVolFlags |= VOL_FLAG_XIP;
        }
    }
    pVolume->hVolume = ::FSDMGR_RegisterVolume(pVolume->hDsk, szFolderName, (PVOLUME)pVolume);
    if (pVolume->hVolume)
    {
        RETAILMSG(1, (L"BINFS: RegisterVolume - Mounted volume '\\%s'\n", szFolderName));
        return TRUE;
    }
    return FALSE;
}

extern "C" BOOL FSD_MountDisk(HDSK hDsk)
{
    BinVolume *pVolume = NULL;
    DWORD dwError = ERROR_SUCCESS;
    BOOL fSuccess = FALSE;
    
    DEBUGMSG(ZONE_API, (L"BINFS: FSD_UnmountDisk\n"));

    pVolume = CreateVolume(hDsk);
    if (pVolume) {
        if (InitBinDescriptors(pVolume) && InitVolume( pVolume)) {
            fSuccess = RegisterVolume( pVolume);
        }    
    } else {
        dwError = ERROR_OUTOFMEMORY;
    }
    if (fSuccess) {
        if (pVolume)
            AddVolume( pVolume);
    } else {
        if (ERROR_SUCCESS != dwError)
            SetLastError(dwError);
        if (pVolume)
            delete pVolume;
    }    
    return fSuccess;
}


/*  FSD_UnmountDisk - Deinitialization service called by FSDMGR.DLL
 *
 *  ENTRY
 *      hdsk == FSDMGR disk handle, or NULL to deinit all
 *      frozen volumes on *any* disk that no longer has any open
 *      files or dirty buffers.
 *
 *  EXIT
 *      0 if failure, or the number of devices that were successfully
 *      unmounted.
 */

extern "C" BOOL FSD_UnmountDisk(HDSK hDsk)
{
    DWORD dwError = ERROR_SUCCESS;
    BOOL fSuccess = FALSE;
    BinVolume *pVolume = FindVolume( hDsk);
    DEBUGMSG(ZONE_API, (L"BINFS: FSD_UnmountDisk\n"));
    if (pVolume) {
        FSDMGR_DeregisterVolume(pVolume->hVolume);
        DeleteVolume( pVolume);
    }    
    if (dwError) {
        SetLastError(dwError);
    }
    return fSuccess;
}



BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    switch(dwReason) {
        case DLL_PROCESS_ATTACH: {
            DEBUGREGISTER((HINSTANCE)hInstance);
            InitializeCriticalSection(&csMain);
            break;
        }
        case DLL_PROCESS_DETACH: {
            DeleteCriticalSection(&csMain);
            break;
        }
        default:
            break;
    }
    return TRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -