Beispiel #1
0
// проверка проекта с чтением из flash
static BOOL validProjectALL(const BOOL flFlash)
{
BYTE CountFlash = 0;
// check error load flash
memset(&PROJ,0,sizeof(PROJ)); // чистим структуру проекта
memset(&crc_idp,0,sizeof(crc_idp));
if(flFlash)CountFlash = 1;
// read project
flash_rd(FLASH_PROGRAM,sizeof(TPROJECT)*CountFlash,(unsigned char*)&PROJ[CUR_DK], sizeof(PROJ[CUR_DK]));
// calcul crc32
const unsigned long crc=crc32_calc((unsigned char*)&PROJ[CUR_DK],sizeof(PROJ[CUR_DK])-sizeof(PROJ[CUR_DK].CRC32));
// read CRC32 programms
unsigned long crc_progs;
flash_rd(FLASH_PROGS,sizeof(TPROGRAMS)*(CUR_DK+1)-sizeof(crc_progs),(unsigned char*)&crc_progs,sizeof(crc_progs));
// check project
if(PROJ[CUR_DK].ProjectSize == sizeof(PROJ[CUR_DK])){
  if(crc==PROJ[CUR_DK].CRC32){
    if(crc_progs==PROJ[CUR_DK].CRC32_programs){
      // сохранить параметры IDP
      crc_idp.crc = PROJ[CUR_DK].IDP_CRC32;
      return true;
      }
    }
  }
return false;
}
Beispiel #2
0
//------------------------------------------------------------------------------
// fin_try==0 - последняя поппытка, можно и записать в журнал ерроры
BOOL ligh_load_init(int  fin_try)
{
    //
    memset(&DK[CUR_DK],0,sizeof(DK[CUR_DK]));
    // clear crc
    memset(&crc_idp,0,sizeof(crc_idp));
    // FLASH_PROGS
    flash_rd(FLASH_PROGRAM, sizeof(TPROJECT)*CUR_DK,
             (unsigned char*)&PROJ[CUR_DK], sizeof(PROJ[CUR_DK]));
    unsigned long crc=crc32_calc((unsigned char*)&PROJ[CUR_DK] ,
                                 sizeof(PROJ[CUR_DK]) - sizeof(PROJ[CUR_DK].CRC32));
    //
    unsigned long crc_progs;
    flash_rd(FLASH_PROGS, sizeof(TPROGRAMS)*(CUR_DK+1)-sizeof(crc_progs) ,
             (unsigned char*)&crc_progs, sizeof(crc_progs));
    //
    crc_idp.crc =  crc_progs;// сохраним для передачи по UDP
    //i_size = sizeof(PROJ[CUR_DK]);
    if (PROJ[CUR_DK].ProjectSize ==sizeof(PROJ[CUR_DK]))
    {
      if ( crc == PROJ[CUR_DK].CRC32)
      {
        //
        if (crc_progs==PROJ[CUR_DK].CRC32_programs)
        {
          Init_DK();
          DK[CUR_DK].proj_valid=true;
          DK[CUR_DK].work = true;
          DK[CUR_DK].progs_valid = true;
          return true;
        }
        else
        {

            dbg_printf("FAULT. CRC32 of progs invalid");
            if (CUR_DK==0)
            if (!fin_try)
              Event_Push_Str("Некорр. программы (CRC)");
        }
      }
      else
      {
        dbg_printf("FAULT. PROJ.CRC32");
        if (CUR_DK==0)
        if (!fin_try)
          Event_Push_Str("Некорр. проект (CRC).");
      }
    }
    else
    {
      if (CUR_DK==0)
       if (!fin_try)
         Event_Push_Str("Некорр. проект (размер).");
       //
      dbg_printf("FAULT. PROJ.ProjectSize ==sizeof(PROJ)");
    }
return false;
}
BOOL
CNdasUnitDeviceCreator::ReadBACL(BLOCK_ACCESS_CONTROL_LIST** ppBACL, UINT32 BACLSize)
{
	//
	// ppBACL will be set only if this function succeed.
	//

	UINT32 ElementCount = 
		(BACLSize - (sizeof(BLOCK_ACCESS_CONTROL_LIST) - sizeof(BLOCK_ACCESS_CONTROL_LIST_ELEMENT))) / 
		sizeof(BLOCK_ACCESS_CONTROL_LIST_ELEMENT);

	// allocate pBACL to fit sector align
	PBLOCK_ACCESS_CONTROL_LIST pBACL = reinterpret_cast<PBLOCK_ACCESS_CONTROL_LIST>(
		::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, 512 * BACL_SECTOR_SIZE(ElementCount)));

	if (NULL == pBACL)
	{
		// Out of memory!
		return FALSE;
	}

	BOOL fSuccess = m_devComm.ReadDiskBlock(
		reinterpret_cast<PBYTE>(pBACL),
		NDAS_BLOCK_LOCATION_BACL,
		BACL_SECTOR_SIZE(ElementCount));

	//
	// Regardless of the existence,
	// Disk Block should be read.
	// Failure means communication error or disk error
	//
	if (!fSuccess) 
	{
		::HeapFree(::GetProcessHeap(), 0, pBACL);
		DBGPRT_ERR(_FT("ReadDiskBlock failed.\n"));
		return FALSE;
	}

	//
	// check structure
	//
	if (BACL_SIGNATURE != pBACL->Signature ||
		BACL_VERSION < pBACL->Version ||
		crc32_calc((unsigned char *)&pBACL->Elements[0],
		sizeof(BLOCK_ACCESS_CONTROL_LIST_ELEMENT) * (pBACL->ElementCount)) != 
		pBACL->crc)
	{
		::HeapFree(::GetProcessHeap(), 0, pBACL);
		DBGPRT_ERR(_FT("Invalid BACL information on disk.\n"));
		return FALSE;
	}

	*ppBACL = pBACL;

	return TRUE;
}
Beispiel #4
0
// проверка проекта
// проверка CRC, размера
static BOOL validProjectRAM(void)
{
const unsigned long crc =crc32_calc((unsigned char*)&PROJ[CUR_DK],sizeof(PROJ[CUR_DK])-sizeof(PROJ[CUR_DK].CRC32));
if(PROJ[CUR_DK].ProjectSize == sizeof(PROJ[CUR_DK])){
  if(crc==PROJ[CUR_DK].CRC32){
    crc_idp.crc = PROJ[CUR_DK].IDP_CRC32; // IDP для передачи по сети.
    return true;
    }
  }
return false;
}
Beispiel #5
0
uint32_t generic_crc32(target *t, uint32_t base, int len)
{
    uint32_t crc = -1;
    uint8_t byte;

    while (len--) {
        byte = target_mem_read8(t, base);

        crc = crc32_calc(crc, byte);
        base++;
    }
    return crc;
}
/* Create and add a node without copying name string.
 * We don't check if the table is full, either.
 */
HashNode *hash_addnocopy(struct HashTable *h, char *name, void *data)
{
	HashNode *n;
	ulong key;

	n = calloc(1, sizeof(HashNode));
	if(!n) return NULL;

	n->name = name;
	n->data = data;
	n->crc = crc32_calc(name, strlen(name));

	h->count++;
	key = n->crc % h->size;
	if(h->buckets[key]) {
		n->next = h->buckets[key];
	}
	h->buckets[key] = n;
	return n;
}
Beispiel #7
0
NTSTATUS
LsuGetBlockACL(
	IN PLANSCSI_SESSION				LSS,
	OUT PBLOCK_ACCESS_CONTROL_LIST	BlockACL,
	IN ULONG						BlockACLLen,
	IN UINT64						LogicalBlockAddress,
	IN ULONG						BlockBytes,
	IN ULONG						PduFlags
) {
	NTSTATUS	status;
	ULONG		readBlock;
	PBYTE		buffer;

	ASSERT(BlockBytes);
	ASSERT(BlockACLLen);

	//
	//	allocate block buffer
	//

	readBlock = (BlockACLLen + BlockBytes) / BlockBytes;
	buffer = (PBYTE)ExAllocatePoolWithTag(NonPagedPool, readBlock * BlockBytes, LSU_POOLTAG_BLOCKBUFFER);
	if(buffer == NULL)
		return STATUS_INSUFFICIENT_RESOURCES;

	status = LsuReadBlocks(LSS, buffer, LogicalBlockAddress, readBlock, BlockBytes, PduFlags);
	if(!NT_SUCCESS(status)) {
		ExFreePoolWithTag(buffer, LSU_POOLTAG_BLOCKBUFFER);
		return status;
	}

	//
	//	Copy to the caller's buffer
	//

	RtlCopyMemory(BlockACL, buffer, BlockACLLen);

	//
	//	Free the buffer
	//

	ExFreePoolWithTag(buffer, LSU_POOLTAG_BLOCKBUFFER);


	//
	//	Revision check
	//

	if( BlockACL->Signature != BACL_SIGNATURE ||
		BlockACL->Version != BACL_VERSION) {

		status = STATUS_REVISION_MISMATCH;
		KDPrintM(DBG_OTHER_ERROR, 
			("Error: Revision mismatch. Signature:0x%08lx, Version:%u\n",
							BlockACL->Signature,
							BlockACL->Version));
	}


	//
	//	CRC check.
	//

	if(NT_SUCCESS(status)) {
		UINT32 crc;
		
		crc = crc32_calc((PUCHAR)BlockACL->Elements,
			BlockACL->ElementCount * sizeof(BLOCK_ACCESS_CONTROL_LIST_ELEMENT));

		if(crc != BlockACL->crc) {
			KDPrintM(DBG_OTHER_ERROR, ("BACL's crc is invalid.\n"));
			return STATUS_REVISION_MISMATCH;
		}
	}

	return status;
}
Beispiel #8
0
BOOL
CNdasUnitDeviceCreator::ConvertDIBv1toDIBv2(
    CONST NDAS_DIB* pDIBv1,
    NDAS_DIB_V2* pDIBv2,
    UINT64 nDiskSectorCount)
{
    XTLASSERT(!IsBadReadPtr(pDIBv1, sizeof(NDAS_DIB)));
    XTLASSERT(!IsBadWritePtr(pDIBv2, sizeof(NDAS_DIB_V2)));

    InitializeDIBv2(pDIBv2, nDiskSectorCount);
    // fit to old system
    pDIBv2->sizeUserSpace = nDiskSectorCount - pDIBv2->sizeXArea;
    pDIBv2->iSectorsPerBit = 0; // no backup information

    // single disk
    if(IS_NDAS_DIBV1_WRONG_VERSION(*pDIBv1) || // no DIB information
            NDAS_DIB_DISK_TYPE_SINGLE == pDIBv1->DiskType)
    {
        InitializeDIBv2AsSingle(pDIBv2);
    }
    else
    {
        // pair(2) disks (mirror, aggregation)
        UNIT_DISK_LOCATION *pUnitDiskLocation0, *pUnitDiskLocation1;
        if(NDAS_DIB_DISK_TYPE_MIRROR_MASTER == pDIBv1->DiskType ||
                NDAS_DIB_DISK_TYPE_AGGREGATION_FIRST == pDIBv1->DiskType)
        {
            pUnitDiskLocation0 = &pDIBv2->UnitDisks[0];
            pUnitDiskLocation1 = &pDIBv2->UnitDisks[1];
        }
        else
        {
            pUnitDiskLocation0 = &pDIBv2->UnitDisks[1];
            pUnitDiskLocation1 = &pDIBv2->UnitDisks[0];
        }

        //
        // EtherAddress Conversion
        //
        if(
            0x00 == pDIBv1->EtherAddress[0] &&
            0x00 == pDIBv1->EtherAddress[1] &&
            0x00 == pDIBv1->EtherAddress[2] &&
            0x00 == pDIBv1->EtherAddress[3] &&
            0x00 == pDIBv1->EtherAddress[4] &&
            0x00 == pDIBv1->EtherAddress[5])
        {
            // usually, there is no ether address information
            C_ASSERT(
                sizeof(pUnitDiskLocation0->MACAddr) ==
                sizeof(m_pDevice->GetDeviceId().Node));

            CopyMemory(
                pUnitDiskLocation0->MACAddr,
                m_pDevice->GetDeviceId().Node,
                sizeof(pUnitDiskLocation0->MACAddr));

            pUnitDiskLocation0->UnitNumber = static_cast<UCHAR>(m_dwUnitNo);
        }
        else
        {
            C_ASSERT(
                sizeof(pUnitDiskLocation0->MACAddr) ==
                sizeof(pDIBv1->EtherAddress));

            CopyMemory(
                pUnitDiskLocation0->MACAddr,
                pDIBv1->EtherAddress,
                sizeof(pUnitDiskLocation0->MACAddr));

            pUnitDiskLocation0->UnitNumber = pDIBv1->UnitNumber;
        }

        //
        // Peer Address Conversion
        //
        {
            C_ASSERT(
                sizeof(pUnitDiskLocation1->MACAddr) ==
                sizeof(pDIBv1->PeerAddress));

            CopyMemory(
                pUnitDiskLocation1->MACAddr,
                pDIBv1->PeerAddress,
                sizeof(pUnitDiskLocation1->MACAddr));

            pUnitDiskLocation1->UnitNumber = pDIBv1->UnitNumber;
        }

        pDIBv2->nDiskCount = 2;
        pDIBv2->nSpareCount = 0;

        switch(pDIBv1->DiskType)
        {
        case NDAS_DIB_DISK_TYPE_MIRROR_MASTER:
            pDIBv2->iMediaType = NMT_MIRROR;
            pDIBv2->iSequence = 0;
            break;
        case NDAS_DIB_DISK_TYPE_MIRROR_SLAVE:
            pDIBv2->iMediaType = NMT_MIRROR;
            pDIBv2->iSequence = 1;
            break;
        case NDAS_DIB_DISK_TYPE_AGGREGATION_FIRST:
            pDIBv2->iMediaType = NMT_AGGREGATE;
            pDIBv2->iSequence = 0;
            break;
        case NDAS_DIB_DISK_TYPE_AGGREGATION_SECOND:
            pDIBv2->iMediaType = NMT_AGGREGATE;
            pDIBv2->iSequence = 1;
            break;
        default:
            return FALSE;
        }
    }

    // write crc
    pDIBv2->crc32 = crc32_calc(
                        (unsigned char *)pDIBv2,
                        sizeof(pDIBv2->bytes_248));

    pDIBv2->crc32_unitdisks = crc32_calc(
                                  (unsigned char *)pDIBv2->UnitDisks,
                                  sizeof(pDIBv2->UnitDisks));

    return TRUE;
}
Beispiel #9
0
BOOL
CNdasUnitDeviceCreator::ReadDIB(NDAS_DIB_V2** ppDIBv2)
{
    //
    // ppDIBv2 will be set only if this function succeed.
    //

    PNDAS_DIB_V2 pDIBv2 = reinterpret_cast<PNDAS_DIB_V2>(
                              HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 512));

    if (NULL == pDIBv2)
    {
        XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                  "ReadDiskBlock failed, error=0x%X\n",
                  GetLastError());

        return FALSE;
    }

    BOOL fSuccess = m_devComm.ReadDiskBlock(
                        reinterpret_cast<PBYTE>(pDIBv2),
                        NDAS_BLOCK_LOCATION_DIB_V2);

    //
    // Regardless of the existence,
    // Disk Block should be read.
    // Failure means communication error or disk error
    //
    if (!fSuccess)
    {
        XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                  "ReadDiskBlock failed, error=0x%X\n",
                  GetLastError());

        XTLVERIFY( HeapFree(GetProcessHeap(), 0, pDIBv2) );

        return FALSE;
    }

    //
    // check signature
    //

    if(NDAS_DIB_V2_SIGNATURE != pDIBv2->Signature ||
            pDIBv2->crc32 != crc32_calc((unsigned char *)pDIBv2,
                                        sizeof(pDIBv2->bytes_248)) ||
            pDIBv2->crc32_unitdisks != crc32_calc((unsigned char *)pDIBv2->UnitDisks,
                    sizeof(pDIBv2->UnitDisks)))
    {
        //
        // Read DIBv1
        //

        fSuccess = ReadDIBv1AndConvert(pDIBv2);

        if (!fSuccess)
        {
            XTLVERIFY( HeapFree(GetProcessHeap(), 0, pDIBv2) );
            return FALSE;
        }

        if ( ! IsConsistentDIB(pDIBv2) )
        {
            // Inconsistent DIB will be reported as single
            InitializeDIBv2AsSingle(pDIBv2);
        }

        *ppDIBv2 = pDIBv2;
        return TRUE;
    }

    //
    // check version
    //
    if(IS_HIGHER_VERSION_V2(*pDIBv2))
    {
        XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                  "Unsupported version V2.\n");

        XTLVERIFY( HeapFree(GetProcessHeap(), 0, pDIBv2) );
        return FALSE;
    }

    //
    // TODO: Lower version process (future code) ???
    //
    if(0)
    {
        XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                  "lower version V2 detected\n");
    }

    //
    // read additional locations if needed
    //
    if (pDIBv2->nDiskCount + pDIBv2->nSpareCount > NDAS_MAX_UNITS_IN_V2)
    {

        UINT32 nTrailSectorCount =
            GET_TRAIL_SECTOR_COUNT_V2(pDIBv2->nDiskCount + pDIBv2->nSpareCount);

        SIZE_T dwBytes = sizeof(NDAS_DIB_V2) + 512 * nTrailSectorCount;

        LPVOID ptr = HeapReAlloc(
                         GetProcessHeap(),
                         HEAP_ZERO_MEMORY,
                         pDIBv2,
                         dwBytes);

        if (NULL == ptr)
        {
            XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                      "HeapReAlloc failed, bytes=%d\n", dwBytes);

            // When HeapReAlloc fails, pDIBv2 should be freed
            XTLVERIFY( HeapFree(GetProcessHeap(), 0, pDIBv2) );

            return FALSE;
        }

        pDIBv2 = reinterpret_cast<PNDAS_DIB_V2>(ptr);

        for(DWORD i = 0; i < nTrailSectorCount; i++) {

            fSuccess = m_devComm.ReadDiskBlock(
                           reinterpret_cast<PBYTE>(pDIBv2) + sizeof(NDAS_DIB_V2) + 512 * i,
                           NDAS_BLOCK_LOCATION_ADD_BIND + i);

            if(!fSuccess)
            {
                XTLTRACE2(NDASSVC_NDASUNITDEVICE, TRACE_LEVEL_ERROR,
                          "Reading additional block failed, block=%d, error=0x%X\n",
                          NDAS_BLOCK_LOCATION_ADD_BIND + i, GetLastError());

                XTLVERIFY( HeapFree(GetProcessHeap(), 0, pDIBv2) );

                return FALSE;
            }
        }
    }

    // Virtual DVD check. Not supported ATM.

    //
    // DIB Consistency Check
    //
    if ( ! IsConsistentDIB(pDIBv2) )
    {
        // Inconsistent DIB will be reported as single
        InitializeDIBv2AsSingle(pDIBv2);
    }

    *ppDIBv2 = pDIBv2;

    return TRUE;
}
Beispiel #10
0
UINT
WINAPI
NdasEncImportSysKeyFromFile(LPCTSTR szFileName)
{
	BYTE lpBuffer[1024] = {0}; // large enough to hold the entire data;
	PNDAS_ENC_SYSKEY_FILE_HEADER lpFileHeader = 
		reinterpret_cast<PNDAS_ENC_SYSKEY_FILE_HEADER>(lpBuffer);

	AutoFileHandle hFile = ::CreateFile(
		szFileName, 
		GENERIC_READ, 
		0, 
		NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL);

	if (INVALID_HANDLE_VALUE == (HANDLE) hFile) {
		return ::GetLastError();
	}

	GUID FileGuid = {0};
	DWORD cbRead = 0;
	BOOL fSuccess = ::ReadFile(
		hFile, 
		lpBuffer, 
		sizeof(lpBuffer),
		&cbRead,
		NULL);

	if (!fSuccess) {
		return ::GetLastError();
	}

	if (cbRead < sizeof(NDAS_ENC_SYSKEY_FILE_HEADER)) {
		return NDASENC_ERROR_INVALID_SYSKEY_FILE;
	}

	if (0 != ::memcmp(
		&lpFileHeader->FileGuid, 
		&NDAS_SYSKEY_FILE_GUID,
		sizeof(NDAS_SYSKEY_FILE_GUID)))
	{
		return NDASENC_ERROR_INVALID_SYSKEY_FILE;
	}

	if (cbRead != 
		lpFileHeader->KeyDataLength + sizeof(NDAS_ENC_SYSKEY_FILE_HEADER))
	{
		return NDASENC_ERROR_INVALID_SYSKEY_FILE;
	}

	lpFileHeader->KeyDecryptedDataCRC32;
	lpFileHeader->KeyData;

	//
	// Encrypt the key (DES)
	//
	xcrypt::IEncryption* pDesEnc = xcrypt::CreateCryptAPIDESEncryption();

	if (NULL == pDesEnc) {
		return ERROR_OUTOFMEMORY;
	}

	fSuccess = pDesEnc->Initialize();

	if (!fSuccess) {
		return ::GetLastError();
	}

	fSuccess = pDesEnc->SetKey(
		(CONST BYTE*) &NDAS_ENC_GUIDS[0],
		sizeof(NDAS_ENC_GUIDS[0]));

	if (!fSuccess) {
		return ::GetLastError();
	}

	fSuccess = pDesEnc->Decrypt(
		lpFileHeader->KeyData, 
		&lpFileHeader->KeyDataLength);

	if (!fSuccess) {
		return ::GetLastError();
	}

	//
	// Check CRC
	//
	DWORD dataCRC32 = crc32_calc(
		lpFileHeader->KeyData, 
		lpFileHeader->KeyDataLength);

	if (dataCRC32 != lpFileHeader->KeyDecryptedDataCRC32) {
		return NDASENC_ERROR_INVALID_SYSKEY_FILE;
	}

#ifdef _DEBUG
	_tprintf(_T("Importing System Key: %s\n"), 
		xs::CXSByteString(
			lpFileHeader->KeyDataLength, 
			lpFileHeader->KeyData, 
			_T(' ')).ToString());
#endif

	UINT uiResult = ::NdasEncSetSysKey(
		lpFileHeader->KeyDataLength, 
		lpFileHeader->KeyData);

	if (ERROR_SUCCESS != uiResult) {
		return uiResult;
	}

	return ERROR_SUCCESS;
}