/* ExtractThread */
VOID
ExtractThread(
	IN PVOID pContext
	)
{
	// Local variables
	PDEVICE_EXTENSION pKeyboardDeviceExtension;
	PDEVICE_OBJECT pKeyboardDeviceObject;
	PLIST_ENTRY pEntry;
	KEY_DATA *pKeyData;

	// Retrieve pointer to device extension and device object
	pKeyboardDeviceExtension = (PDEVICE_EXTENSION)pContext;
	pKeyboardDeviceObject = pKeyboardDeviceExtension->pKeyboardDevice;

	// Enter main thread loop
	while(true)
	{
		// Wait for KEY_DATA struct to become available in queue
		KeWaitForSingleObject(&((pKeyboardDeviceExtension->bufferQueue).semQueue),
							Executive,
							KernelMode,
							FALSE,
							NULL
							);

		// Pop off the first entry and save it for the time being
		pEntry = ExInterlockedRemoveHeadList(&((pKeyboardDeviceExtension->bufferQueue).QueueListHead),
												&((pKeyboardDeviceExtension->bufferQueue).lockQueue));

		// Check to see if the thread isn't set to terminate
		if(pKeyboardDeviceExtension->bExtractTerminate == true)
			PsTerminateSystemThread(STATUS_SUCCESS);

		// Retrieve the KEY_DATA struct associated with the list entry
		pKeyData = CONTAINING_RECORD(pEntry, KEY_DATA, ListEntry);

		// TODO: need to ensure that data was properly set?

		// Send data off to comparison component
		enqueueData(pKeyData->Data, 'b');

	}
    return;

} // end ExtractThread
Esempio n. 2
0
void SocketDataQueue::addData(const char *data, const unsigned int len)
{
    // if we're not expecting more data after this
    if (m_leftoverRemaining <= len) {
        unsigned int bytesLeft = len;
        // if we have data left over from last add
        if (m_leftover != NULL) {
            memcpy(m_leftover+(m_leftoverSize-m_leftoverRemaining), data,
                   m_leftoverRemaining);

            enqueueData(m_leftover, m_leftoverSize);
            delete[] m_leftover;
            m_leftover = NULL;
            m_leftoverSize = 0;
            m_leftoverRemaining = 0;

            data += m_leftoverRemaining;
            bytesLeft -= m_leftoverRemaining;
        }


//        const char* dataEnd = data+bytesLeft;
        // while there's still bytes to parse
        while (bytesLeft > 0) {
            unsigned int msgSize = *(data); // cast first byte into an int
            data++;
            bytesLeft--;
            // make sure we rcvd the whole message, increment pointers
            if (msgSize <= bytesLeft) {
                enqueueData(data, msgSize);
                data += msgSize;
                bytesLeft -= msgSize;
            } else {
                // save data for next add, remaining = total size - bytes left
                saveLeftover(data, msgSize, msgSize-bytesLeft);
            }
        }
    } else {
        // expecting more data, copy what we have and update remaining bytes
        memcpy(m_leftover+(m_leftoverSize-m_leftoverRemaining), data, len);
        m_leftoverRemaining -= len;
    }
//    while (data != dataEnd) {
//        unsigned int msgSize = *(data);
//        data++;
//        enqueueData(data, msgSize);
//        data += msgSize;
//    }
//    unsigned int msgSize = *(data);
//    data++;
//    while (data+msgSize < dataEnd) {

//    }


//    unsigned int i = 0;
//    while (i < len) {

//    }
//    char* newData = new char[len+m_leftoverSize];
//    memcpy(newData, m_leftover, m_leftoverSize);
//    memcpy(newData+m_leftoverSize, data, len);

//    delete[] m_leftover;
//    m_leftover = NULL;
//    m_leftoverSize = 0;


//    unsigned int i = 0;
//    unsigned int k = 0;
//    while (i < len) {
//        while (k < len && data[k] != '\n') {
//            k++;
//        }
//        if (k < len) {
//            enqueueData(data+i, k-i);
//            k++;
//            i = k;
//        }
//    }

//    if (data[len-1] != '\n') {
//        saveLeftover(data+i, len-i);
//    }
}