#include <windows.h>
#include "resource.h"

#define IOCTL_ERASE_FALSHFX_DISK 	0x1

HANDLE hPort = INVALID_HANDLE_VALUE;

typedef struct _FXDISK_INFO
{
	ULONG FxDiskStart;
	ULONG FxDiskSize;
}FXDISK_INFO;

BOOL ReadFxDiskinfo(FXDISK_INFO *FxDisk);
BOOL EraseFlashFxDisk();

BOOL CALLBACK EraseFXDiskDlgProc(HWND hwndDlg,
                           UINT message,
                           WPARAM wParam,
                           LPARAM lParam)
{
    UINT nID;

    switch(message)
    {
    case WM_INITDIALOG:

        return (FALSE);

    case WM_COMMAND:
        nID = LOWORD(wParam);
        switch(nID)
        {
        case IDOK:
			EraseFlashFxDisk();
			break;
        case IDCANCEL:
            EndDialog(hwndDlg, nID);
			return (FALSE);
            break;

        default:
            break;
        }   //End of switch(nID) block

		EndDialog(hwndDlg, nID);		
        return (TRUE);

    default:
        return (FALSE);

    }
	return (FALSE);

}


BOOL EraseFlashFxDisk()
{
	BOOL bRet;
	ULONG BytesRet;
	FXDISK_INFO fxdisk;


	//RETAILMSG(1,(L" EraseFXDisk: Start...\r\n"));


	hPort = CreateFile (TEXT("FSH1:"),					// Port Name (Unicode compatible)
						GENERIC_WRITE,					// Open for Read
            			0,            					// COM port cannot be shared
            			NULL,          					// Always NULL for Windows CE
            			OPEN_EXISTING, 					// For communication resource
            			0,             					// Non-overlapped operation only
            			NULL);         					// Always NULL for Windows CE



	if(hPort == INVALID_HANDLE_VALUE)
	{
		RETAILMSG(1,(L" Can't open %s. \r\n",TEXT("FSH1:")));
		return 1;
	}
	
	ReadFxDiskinfo(&fxdisk);

	if((fxdisk.FxDiskSize <= 0) || (fxdisk.FxDiskStart <= 0))
	{
		return 0;
	}

	
	bRet = DeviceIoControl(	hPort,
							IOCTL_ERASE_FALSHFX_DISK,
							&fxdisk,
							sizeof(fxdisk),
							NULL,
							0,
							&BytesRet,
							NULL);


	if(hPort != INVALID_HANDLE_VALUE)
	{
		CloseHandle(hPort);
		hPort = INVALID_HANDLE_VALUE;
	}

	//RETAILMSG(1,(L" EraseFXDisk: Done ...\r\n"));

	return 0;
}

BOOL ReadFxDiskinfo(FXDISK_INFO *FxDisk)
{
    UINT32  status;
    HKEY    regKey;
	ULONG  ValLen,ValType;
	BOOL bRet = FALSE;
	
	
    status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                         __TEXT("Drivers\\BuiltIn\\FlashFx"),
                         0,
                         0,
                         &regKey);

    if ( status == ERROR_SUCCESS ) 
	{
        ValLen = sizeof(FxDisk->FxDiskStart);

        status = RegQueryValueEx(regKey,
                                __TEXT("Start"),
                                NULL,
                                &ValType,
                                (PUCHAR)&FxDisk->FxDiskStart,
                                &ValLen);

        ValLen = sizeof(FxDisk->FxDiskSize);

        status = RegQueryValueEx(regKey,
                                __TEXT("Length"),
                                NULL,
                                &ValType,
                                (PUCHAR)&FxDisk->FxDiskSize,
                                &ValLen);

		//RETAILMSG(1,(L" FxDisk->FxDiskStart = 0x%08x\r\n",FxDisk->FxDiskStart));
		//RETAILMSG(1,(L" FxDisk->FxDiskSize = 0x%08x\r\n",FxDisk->FxDiskSize));

		bRet=TRUE;
                                
	}
	else
	{
		bRet=FALSE;
	}

   	RegCloseKey(regKey);

	return bRet;

}