/* 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
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); // } }