system.c

来自「针对Intel Xscale PXA255的WinCE boot loader源」· C语言 代码 · 共 640 行 · 第 1/2 页

C
640
字号


//
// I/O Control function - responds to info, read and write control codes.
// The read and write take a scatter/gather list in pInBuf
//

//Modified for write protect issue
BOOL
DSK_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    PDISK pDisk = (PDISK)Handle;
    PSG_REQ pSG;

	DEBUGMSG(ZONE_FUNCTION, (TEXT("DSK_IOControl()\r\n")));
	RETAILMSG(IOTRACE, (TEXT("----------dwIoControlCode:%d---------\r\n"),dwIoControlCode));

    if(IsValidDisk(pDisk) == FALSE)
	{
		SetLastError(ERROR_INVALID_HANDLE);
		return FALSE;
    }

    if(pDisk->d_DiskCardState != STATE_OPENED)
	{
		SetLastError(GetDiskStateError(pDisk->d_DiskCardState));
		return FALSE;
    }

    //
    // Check parameters
    //
    switch (dwIoControlCode)
	{
    	case DISK_IOCTL_WRITE:
    		RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_WRITE---------\r\n")));

    	case IOCTL_DISK_WRITE:
		RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_WRITE---------\r\n")));
    		    if(pInBuf == NULL)
				{
    		        SetLastError(ERROR_INVALID_PARAMETER);
    		        return FALSE;
    		    }
				if(bWriteProtect)
				{
					SetLastError(ERROR_WRITE_PROTECT);
					pSG = (PSG_REQ)pInBuf;
					pSG->sr_status = ERROR_WRITE_PROTECT;
					return FALSE;
				}
    		    break;
    	case DISK_IOCTL_READ:
    		RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_READ---------\r\n")));
    	case DISK_IOCTL_GETINFO:
    	case DISK_IOCTL_SETINFO:
    	case DISK_IOCTL_INITIALIZED:

    	case IOCTL_DISK_READ:
    		RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_READ---------\r\n")));
    	case IOCTL_DISK_GETINFO:
    	case IOCTL_DISK_SETINFO:
    	case IOCTL_DISK_INITIALIZED:

		RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_INITIALIZED---------\r\n")));
    		    if(pInBuf == NULL)
				{
    		        SetLastError(ERROR_INVALID_PARAMETER);
    		        return FALSE;
    		    }
    		    break;

    	case IOCTL_DISK_GET_STORAGEID:
    		RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_GET_STORAGEID---------\r\n")));
    		    if(pOutBuf == NULL)
				{
    		        SetLastError(ERROR_INVALID_PARAMETER);
    		        return FALSE;
    		    }
    		    break;

    	case IOCTL_DISK_DEVICE_INFO:
         	 //   if ((nInBufSize== 0) || (pInBuf== NULL))
         	 	RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_DEVICE_INFO---------\r\n")));
         	    if ((nInBufSize!= sizeof(STORAGEDEVICEINFO)) || (pInBuf== NULL))
        	    {
            		SetLastError(ERROR_INVALID_PARAMETER);
            		return FALSE;
        	    }
        	    break;
	    case DISK_IOCTL_GETNAME:
	    		RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_GETNAME---------\r\n")));
				if(pOutBuf == NULL)
				{
					SetLastError(ERROR_INVALID_PARAMETER);
					return FALSE;
				}
				break;

	    case DISK_IOCTL_FORMAT_MEDIA:
	        	SetLastError(ERROR_SUCCESS);
	        	return TRUE;
    
	    default:
	        	SetLastError(ERROR_INVALID_PARAMETER);
	        	return FALSE;
	}

    switch (dwIoControlCode)
	{
    	case DISK_IOCTL_READ:

		case IOCTL_DISK_READ:
				RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_READ==2==---------\r\n")));
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_READ;\r\n")));
				pSG = (PSG_REQ)pInBuf;
				DoDiskIO(pDisk, dwIoControlCode, pSG);
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_READ DoDiskIO OUT;\r\n")));
				if (pSG->sr_status)
				{
	    			SetLastError(pSG->sr_status);
	    			DEBUGMSG(ZONE_ERROR, (TEXT("DISK_IOControl() DISK_IOCTL_READ or DISK_IOCTL_WRITE status=0x%08x;\r\n"),pSG->sr_status));
				    return FALSE;
				}
				return TRUE;

    	case DISK_IOCTL_WRITE:
    		RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_WRITE==2==---------\r\n")));

		case IOCTL_DISK_WRITE:
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_WRITE;\r\n")));
				pSG = (PSG_REQ)pInBuf;
				RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_WRITE==2==||||TEST01||||---------\r\n")));
			    if (PSLGetCallerTrust()!= OEM_CERTIFY_TRUST) {
			        PSG_REQ pSgReq=pSG;
			        if  (pSgReq && nInBufSize >= (sizeof(SG_REQ) + sizeof(SG_BUF) * (pSgReq->sr_num_sg - 1))) {
			            DWORD dwIndex;
			            for (dwIndex=0; dwIndex < pSgReq -> sr_num_sg; dwIndex++) {
			                pSgReq->sr_sglist[dwIndex].sb_buf =
			                    (PUCHAR)MapCallerPtr((LPVOID)pSgReq->sr_sglist[dwIndex].sb_buf,pSgReq->sr_sglist[dwIndex].sb_len);
			            }
			        }
			        else {// Parameter Wrong.
			            SetLastError(ERROR_INVALID_PARAMETER);
			            return FALSE;
			        };
			    }
				
				DoDiskIO(pDisk, dwIoControlCode, pSG);
				if (pSG->sr_status)
				{
	    			SetLastError(pSG->sr_status);
	    			DEBUGMSG(ZONE_ERROR, (TEXT("DISK_IOControl() DISK_IOCTL_READ or DISK_IOCTL_WRITE status=0x%08x;\r\n"),pSG->sr_status));
				    return FALSE;
				}
				return TRUE;

    	case DISK_IOCTL_GETINFO:
    				RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_GETINFO==2==---------\r\n")));
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_GETINFO;\r\n")));
				SetLastError(GetDiskInfo(pDisk, (PDISK_INFO)pInBuf));
				return TRUE;

    	case DISK_IOCTL_SETINFO:
    				RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_SETINFO==2==---------\r\n")));
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_SETINFO;\r\n")));
		  		SetLastError(SetDiskInfo(pDisk, (PDISK_INFO)pInBuf));
				return TRUE;



    	case DISK_IOCTL_FORMAT_MEDIA:
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_FORMAT_MEDIA;\r\n")));
				SetLastError(ERROR_SUCCESS);
				return TRUE;

    	case DISK_IOCTL_GETNAME:
    				RETAILMSG(IOTRACE, (TEXT("----------DISK_IOCTL_GETNAME==2==---------\r\n")));
				DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() DISK_IOCTL_GETNAME;\r\n")));
        		return GetFolderName(pDisk, (LPWSTR)pOutBuf, nOutBufSize, pBytesReturned);

    	case IOCTL_DISK_DEVICE_INFO:
    	{
    		
        		PSTORAGEDEVICEINFO psdi = (PSTORAGEDEVICEINFO)pInBuf;
        		RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_DEVICE_INFO==2==---------\r\n")));
			DEBUGMSG(ZONE_FUNCTION, (TEXT("DISK_IOControl() IOCTL_DISK_DEVICE_INFO\r\n")));

        		if (nInBufSize == sizeof(STORAGEDEVICEINFO)) {
           		 	wcscpy( psdi->szProfile, L"SDMMC");
            			psdi->dwDeviceClass = STORAGE_DEVICE_CLASS_BLOCK;
            			psdi->dwDeviceType |= STORAGE_DEVICE_TYPE_REMOVABLE_MEDIA;
            			psdi->dwDeviceType |= STORAGE_DEVICE_TYPE_UNKNOWN;
            			psdi->dwDeviceFlags |= STORAGE_DEVICE_FLAG_READWRITE;
            			if (pBytesReturned)
                			*pBytesReturned = sizeof(STORAGEDEVICEINFO);
                                DEBUGMSG(1, (TEXT("RETURN TRUE\r\n")));
            			return TRUE;
        		}
			else
			{
            			SetLastError( ERROR_INVALID_PARAMETER);
    				DEBUGMSG(ZONE_ERROR, (TEXT("RETURN FALSE\r\n")));
            			return FALSE;
        		}
    	}
		case IOCTL_DISK_GET_STORAGEID:  // TBD later
			RETAILMSG(IOTRACE, (TEXT("----------IOCTL_DISK_GET_STORAGEID==2==---------\r\n")));
			return GetStorageID(pDisk,
						(PSTORAGE_IDENTIFICATION)pOutBuf,
						nOutBufSize,
						pBytesReturned);
//#endif	
    	default:
				DEBUGMSG(ZONE_ERROR, (TEXT("DISK_IOControl() default;\r\n")));
				SetLastError(ERROR_INVALID_PARAMETER);
				return FALSE;
    }
}   // DSK_IOControl



DWORD DSK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD DSK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD DSK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod){return 0;}
void DSK_PowerUp(void)
{
	hw_powerup();
}
void DSK_PowerDown(void) 
{
	hw_powerdown();
}


//
// Returns TRUE if the MMC card is inserted
//
bool
IsCardInserted(
    PDISK pDisk
    )
{
    INT16 logical_drive;

    logical_drive = (0xFFFF & (INT16)pDisk->d_DrvNo); 


    // Check for MMC card presenting and working
    if (is_device_changed (logical_drive))
    return FALSE;

    return TRUE;

}   // IsCardInserted


//
// mmcinit:
//
// ActivePath is the registry path to our device's active key under
// HKEY_LOCAL_MACHINE\Drivers\Active
// Allocate storage to hold a copy of this and point pDisk->d_ActivePath
// to it. This will be used in getfoldername call.
//
// Return pointer to new disk structure or NULL.
//
PDISK
mmcinit(
    LPTSTR ActiveKey
    )
{
    DWORD status;
    PDISK pDisk;
    HKEY hKey;

    pDisk = CreateDiskObject();
    if (pDisk == NULL) {
    RETAILMSG(INIT, (TEXT("MmcDisk LocalAlloc(PDISK) failed %d\r\n"), GetLastError()));
    return NULL;
    }
    if (pDisk->d_ActivePath = LocalAlloc(LPTR, wcslen(ActiveKey)*sizeof(WCHAR)+sizeof(WCHAR))) {
    wcscpy(pDisk->d_ActivePath, ActiveKey);
    }


	hKey = OpenDriverKey( ActiveKey);
	RegCloseKey( hKey);
    //
    // InitDisk 
    //
    status = InitDisk(pDisk);
    if (status) {
    goto ci_fail;
    }



    if (pDisk->d_DiskCardState == STATE_INITING) {
    pDisk->d_DiskCardState = STATE_CLOSED;
    return pDisk;
    }


ci_fail:
/*    pDisk->d_pDataReg = NULL;*/


    CloseDisk(pDisk);
    return NULL;
}   // mmcinit

⌨️ 快捷键说明

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