Example #1
0
NTSTATUS HandleTablehandleTranslate(PCHANDLE_TABLE HandleTable, HANDLE Handle, PVOID *Object)
{
	KIRQL irql;
	PCHANDLE_TABLE_MAPPING mapping = NULL;
	PHASH_ITEM hashItem = NULL;
	NTSTATUS status = STATUS_UNSUCCESSFUL;
	DEBUG_ENTER_FUNCTION("Handletable=0x%p; Handle=0x%p; Object=0x%p", HandleTable, Handle, Object);

	_HandleTableLockShared(HandleTable, &irql);
	hashItem = HashTableGet(HandleTable->HashTable, Handle);
	if (hashItem != NULL) {
		PVOID object = NULL;
		HANDLE handleValue = NULL;
		PCHANDLE_TABLE handleTable = NULL;

		mapping = CONTAINING_RECORD(hashItem, CHANDLE_TABLE_MAPPING, HashItem);
		object = mapping->Object;
		handleValue = mapping->HandleValue;
		handleTable = mapping->HandleTable;
		_HandleTableUnlock(HandleTable, irql);
		HandleTable->HandleTranslateProcedure(handleTable, object, handleValue);
		*Object = object;
		status = STATUS_SUCCESS;
	} else {
		_HandleTableUnlock(HandleTable, irql);
		status = STATUS_INVALID_HANDLE;
	}

	DEBUG_EXIT_FUNCTION("0x%x, *Object=0x%p", status, *Object);
	return status;
}
Example #2
0
void AsmPass1(Assembler *a, char *text) {             // 第一階段的組譯           
  int i, address = 0, number;                                                 
  Array* lines = split(text, "\r\n", REMOVE_SPLITER); // 將組合語言分割成一行一行
  ArrayEach(lines, strPrintln);                       // 印出以便觀察           
  printf("=================PASS1================\n");               
  for (i=0; i<lines->count; i++) {                    // 對於每一行                        
      strReplace(lines->item[i], ";", '\0');
      strReplace(lines->item[i], "\t", ' ');
      AsmCode *code = AsmCodeNew(lines->item[i]);     // 建立指令物件
      if (code == NULL) continue;
      code->address = address;                        // 設定該行的位址      
      Op *op = NULL;
      if (code->op != NULL) {
        op = HashTableGet(opTable, code->op);           // 查詢運算碼            
        if (op != NULL) {                               // 如果查到
          code->opCode = op->code;                      //    設定運算碼
          code->type = op->type;                        //    設定型態
        }                                                  
      }
      if (code->label != NULL)                        // 如果有標記符號
        HashTablePut(a->symTable, code->label, code); //    加入符號表中
      ArrayAdd(a->codes, code);                       //  建構指令物件陣列
      AsmCodePrintln(code);                           //    印出觀察
      code->size = AsmCodeSize(code);                 //  計算指令大小
      address += code->size;                          //  計算下一個指令位址
  }                                                                           
  ArrayFree(lines, strFree);                          // 釋放記憶體
}
Example #3
0
NTSTATUS DriverHookRecordDeleteDevice(PDEVICE_HOOK_RECORD DeviceRecord)
{
	KIRQL irql;
	PHASH_ITEM h = NULL;
	PDRIVER_HOOK_RECORD driverRecord = NULL;
	NTSTATUS status = STATUS_UNSUCCESSFUL;
	PDEVICE_HOOK_RECORD deviceRecord = NULL;
	DEBUG_ENTER_FUNCTION("DeviceRecord=0x%p", DeviceRecord);

	driverRecord = DeviceRecord->DriverRecord;
	KeAcquireSpinLock(&driverRecord->SelectedDevicesLock, &irql);
	h = HashTableGet(driverRecord->SelectedDevices, DeviceRecord->DeviceObject);
	if (h != NULL) {
		deviceRecord = CONTAINING_RECORD(h, DEVICE_HOOK_RECORD, HashItem);
		DeviceHookRecordReference(deviceRecord);
		KeReleaseSpinLock(&driverRecord->SelectedDevicesLock, irql);
		if (deviceRecord->CreateReason == edrcrUserRequest) {
			deviceRecord->CreateReason = edrcrDriverHooked;
			deviceRecord->MonitoringEnabled = FALSE;
			_InvalidateDeviceHookRecord(deviceRecord);
			status = STATUS_SUCCESS;
		} else status = STATUS_NOT_FOUND;
		
		DeviceHookRecordDereference(deviceRecord);
	} else {
		KeReleaseSpinLock(&driverRecord->SelectedDevicesLock, irql);
		status = STATUS_NOT_FOUND;
		ASSERT(FALSE);
	}

	DEBUG_EXIT_FUNCTION("0x%x", status);
	return status;
}
Example #4
0
WordFormRule *WordFormGetRules(char *suffix1, char *lefeat1)
{
  char	index[PHRASELEN];
  StringCpy(index, suffix1, PHRASELEN);
  StringCat(index, lefeat1, PHRASELEN);
  return((WordFormRule *)HashTableGet(WordFormHt, index));
}
Example #5
0
NTSTATUS DriverHookRecordAddDevice(PDRIVER_HOOK_RECORD DriverRecord, PDEVICE_OBJECT DeviceObject, PUCHAR IRPSettings, PUCHAR FastIoSettings, BOOLEAN MonitoringEnabled, PDEVICE_HOOK_RECORD *DeviceRecord)
{
	KIRQL irql;
	PHASH_ITEM h = NULL;
	PDEVICE_HOOK_RECORD newDeviceRecord = NULL;
	NTSTATUS status = STATUS_UNSUCCESSFUL;
	DEBUG_ENTER_FUNCTION("Record=0x%p; DeviceObject=0x%p; IRPSettings=0x%p; FastIoSettings=0x%p; MonitoringEnabled=%u; DeviceRecord=0x%p", DriverRecord, DeviceObject, IRPSettings, FastIoSettings, MonitoringEnabled, DeviceRecord);
	
	status = _DeviceHookRecordCreate(DriverRecord, &newDeviceRecord, IRPSettings, FastIoSettings, MonitoringEnabled, edrcrUserRequest, DeviceObject);
	if (NT_SUCCESS(status)) {
		KeAcquireSpinLock(&DriverRecord->SelectedDevicesLock, &irql);
		h = HashTableGet(DriverRecord->SelectedDevices, DeviceObject);
		if (h == NULL) {
			// For the hash table
			DeviceHookRecordReference(newDeviceRecord);
			HashTableInsert(DriverRecord->SelectedDevices, &newDeviceRecord->HashItem, DeviceObject);
			KeReleaseSpinLock(&DriverRecord->SelectedDevicesLock, irql);
			_MakeDeviceHookRecordValid(newDeviceRecord);
			// For the reference going out of this routine
			DeviceHookRecordReference(newDeviceRecord);
			*DeviceRecord = newDeviceRecord;
		} else {
			PDEVICE_HOOK_RECORD existingDeviceRecord = NULL;

			existingDeviceRecord = CONTAINING_RECORD(h, DEVICE_HOOK_RECORD, HashItem);
			DeviceHookRecordReference(existingDeviceRecord);
			KeReleaseSpinLock(&DriverRecord->SelectedDevicesLock, irql);
			if (existingDeviceRecord->CreateReason == edrcrDriverHooked) {
				memset(existingDeviceRecord->IRPMonitorSettings, TRUE, (IRP_MJ_MAXIMUM_FUNCTION + 1)*sizeof(UCHAR));
				if (IRPSettings != NULL)
					memcpy(existingDeviceRecord->IRPMonitorSettings, IRPSettings, (IRP_MJ_MAXIMUM_FUNCTION + 1)*sizeof(UCHAR));

				memset(existingDeviceRecord->FastIoMonitorSettings, TRUE, FastIoMax*sizeof(UCHAR));
				if (FastIoSettings != NULL)
					memcpy(existingDeviceRecord->FastIoMonitorSettings, FastIoSettings,  FastIoMax*sizeof(UCHAR));

				existingDeviceRecord->CreateReason = edrcrUserRequest;
				existingDeviceRecord->MonitoringEnabled = MonitoringEnabled;
				_MakeDeviceHookRecordValid(existingDeviceRecord);
				DeviceHookRecordReference(existingDeviceRecord);
				*DeviceRecord = existingDeviceRecord;
				status = STATUS_SUCCESS;
			} else status = STATUS_ALREADY_REGISTERED;

			DeviceHookRecordDereference(existingDeviceRecord);
		}

		DeviceHookRecordDereference(newDeviceRecord);
	}

	DEBUG_EXIT_FUNCTION("0x%x, *DeviceRecord=0x%p", status, *DeviceRecord);
	return status;
}
Example #6
0
static VOID _InvalidateDriverHookRecord(PDRIVER_HOOK_RECORD DriverRecord)
{
	KIRQL irql;
	DEBUG_ENTER_FUNCTION("DriverRecord=0x%p", DriverRecord);

	KeAcquireSpinLock(&_driverValidationTableLock, &irql);
	ASSERT(HashTableGet(_driverValidationTable, DriverRecord) != NULL);
	HashTableDelete(_driverValidationTable, DriverRecord);
	KeReleaseSpinLock(&_driverValidationTableLock, irql);

	DEBUG_EXIT_FUNCTION_VOID();
	return;
}
Example #7
0
static VOID _MakeDriverHookRecordValid(PDRIVER_HOOK_RECORD DriverRecord)
{
	KIRQL irql;
	DEBUG_ENTER_FUNCTION("DriverRecord=0x%p", DriverRecord);

	KeAcquireSpinLock(&_driverValidationTableLock, &irql);
	ASSERT(HashTableGet(_driverValidationTable, DriverRecord) == NULL);
	HashTableInsert(_driverValidationTable, &DriverRecord->ValidationHashItem, DriverRecord);
	KeReleaseSpinLock(&_driverValidationTableLock, irql);

	DEBUG_EXIT_FUNCTION_VOID();
	return;
}
Example #8
0
NTSTATUS HookDriverObject(PDRIVER_OBJECT DriverObject, PDRIVER_MONITOR_SETTINGS MonitorSettings, PDRIVER_HOOK_RECORD *DriverRecord)
{
	KIRQL irql;
	PDRIVER_HOOK_RECORD record = NULL;
	PDEVICE_HOOK_RECORD *existingDevices = NULL;
	ULONG existingDeviceCount = 0;
	NTSTATUS status = STATUS_UNSUCCESSFUL;
	DEBUG_ENTER_FUNCTION("DriverObject=0x%p; MonitorSettings=%u; DriverRecord=0x%p", DriverObject, MonitorSettings, DriverRecord);

	status = _DriverHookRecordCreate(DriverObject, MonitorSettings, FALSE, &record);
	if (NT_SUCCESS(status)) {
		status = _CreateRecordsForExistingDevices(record, &existingDevices, &existingDeviceCount);
		if (NT_SUCCESS(status)) {
			KeAcquireSpinLock(&_driverTableLock, &irql);
			if (HashTableGet(_driverTable, DriverObject) == NULL) {
				KIRQL irql2;
				ULONG i = 0;

				DriverHookRecordReference(record);
				HashTableInsert(_driverTable, &record->HashItem, DriverObject);
				KeAcquireSpinLock(&record->SelectedDevicesLock, &irql2);
				for (i = 0; i < existingDeviceCount; ++i) {
					PDEVICE_HOOK_RECORD deviceRecord = existingDevices[i];

					DeviceHookRecordReference(deviceRecord);
					HashTableInsert(record->SelectedDevices, &deviceRecord->HashItem, deviceRecord->DeviceObject);
				}

				KeReleaseSpinLock(&record->SelectedDevicesLock, irql2);
				KeReleaseSpinLock(&_driverTableLock, irql);
				_MakeDriverHookRecordValid(record);
				if (record->MonitoringEnabled)
					_HookDriverObject(DriverObject, record);

				DriverHookRecordReference(record);
				*DriverRecord = record;
			} else {
				KeReleaseSpinLock(&_driverTableLock, irql);
				status = STATUS_ALREADY_REGISTERED;
			}

			_FreeDeviceHookRecordArray(existingDevices, existingDeviceCount);
		}

		DriverHookRecordDereference(record);
	}

	DEBUG_EXIT_FUNCTION("0x%x, *DriverRecord=0x%p", status, *DriverRecord);
	return status;
}
Example #9
0
BOOLEAN DriverHookRecordValid(PDRIVER_HOOK_RECORD DriverRecord)
{
	KIRQL irql;
	BOOLEAN ret = FALSE;
	DEBUG_ENTER_FUNCTION("DriverRecord=0x%p", DriverRecord);

	KeAcquireSpinLock(&_driverValidationTableLock, &irql);
	ret = HashTableGet(_driverValidationTable, DriverRecord) != NULL;
	if (ret)
		DriverHookRecordReference(DriverRecord);

	KeReleaseSpinLock(&_driverValidationTableLock, irql);

	DEBUG_EXIT_FUNCTION("%u", ret);
	return ret;
}
Example #10
0
void AsmCodeParse(AsmCode *code, Assembler *a) {
  int i, rIdx=0;
  for (i=0; i<3; i++) {
    if (code->arg[i] == NULL) 
       break;
    if (sscanf(code->arg[i], "R%d", &code->r[rIdx])>0)           // 可能是暫存器,例如 R1 
      rIdx++;
    else if (sscanf(code->arg[i], "%d", &code->cx) == 0) {       // 可能是常數,例如 37 
      AsmCode *labelCode = HashTableGet(a->symTable, code->arg[i]);       // 可能是符號
      if (labelCode != NULL) {
        code->cx = labelCode->address - code->address - 4;             // 計算 cx 欄位,相對於 PC 編碼 
        code->r[rIdx++] = 15;                                          // rb = PC = R15
      }
    }
  }
  code->rCount = rIdx;
}
Example #11
0
PDEVICE_HOOK_RECORD DriverHookRecordGetDevice(PDRIVER_HOOK_RECORD Record, PDEVICE_OBJECT DeviceObject)
{
	KIRQL irql;
	PHASH_ITEM h = NULL;
	PDEVICE_HOOK_RECORD ret = NULL;
	DEBUG_ENTER_FUNCTION("Record=0x%p; DeviceObject=0x%p", Record, DeviceObject);

	KeAcquireSpinLock(&Record->SelectedDevicesLock, &irql);
	h = HashTableGet(Record->SelectedDevices, DeviceObject);
	if (h != NULL) {
		ret = CONTAINING_RECORD(h, DEVICE_HOOK_RECORD, HashItem);
		DeviceHookRecordReference(ret);
	}

	KeReleaseSpinLock(&Record->SelectedDevicesLock, irql);

	DEBUG_EXIT_FUNCTION("0x%p", ret);
	return ret;
}
Example #12
0
PDRIVER_HOOK_RECORD DriverHookRecordGet(PDRIVER_OBJECT DriverObject)
{
	KIRQL irql;
	PHASH_ITEM h = NULL;
	PDRIVER_HOOK_RECORD ret = NULL;
	DEBUG_ENTER_FUNCTION("DriverObject=0x%p", DriverObject);

	KeAcquireSpinLock(&_driverTableLock, &irql);
	h = HashTableGet(_driverTable, DriverObject);
	if (h != NULL) {
		ret = CONTAINING_RECORD(h, DRIVER_HOOK_RECORD, HashItem);
		DriverHookRecordReference(ret);
	}

	KeReleaseSpinLock(&_driverTableLock, irql);

	DEBUG_EXIT_FUNCTION("0x%p", ret);
	return ret;
}
Example #13
0
void WordFormRuleAdd(char *suffix1, char *lefeat1, char *linkfeat1,
                     char *suffix2, char *lefeat2, char *linkfeat2,
                     LexEntry *le1, LexEntry *le2)                     
{
  char	index[PHRASELEN];
  WordFormRule	*wfr;
  wfr = CREATE(WordFormRule);
  wfr->count = 1;
  wfr->suffix1 = suffix1;
  wfr->lefeat1 = lefeat1;
  wfr->linkfeat1 = linkfeat1;
  wfr->suffix2 = suffix2;
  wfr->lefeat2 = lefeat2;
  wfr->linkfeat2 = linkfeat2;
  StringCpy(index, suffix1, PHRASELEN);
  StringCat(index, lefeat1, PHRASELEN);
  wfr->example1 = le1;
  wfr->example2 = le2;
  wfr->next = (WordFormRule *)HashTableGet(WordFormHt, index);
  HashTableSetDup(WordFormHt, index, wfr);
}
int transfer_SAM_to_position_table(char * sam_file)
{
	char linebuf[max(2*MAX_READ_LENGTH+300,3000)];
	int allreads=0,mapped=0;
	char mate_chro[MAX_CHROMOSOME_NAME_LEN+1];
	unsigned int mate_pos;
	int flags_mate;
	char cigar_mate[EXON_MAX_CIGAR_LEN+1];
	gene_input_t input_file;

	HashTable * local_reassembly_pileup_files;
	HashTable * chromosome_size_table;


	chromosome_size_table = HashTableCreate(100);
	HashTableSetDeallocationFunctions(chromosome_size_table, NULL, NULL);
	HashTableSetKeyComparisonFunction(chromosome_size_table, my_strcmp);
	HashTableSetHashFunction(chromosome_size_table, HashTableStringHashFunction);

	local_reassembly_pileup_files = HashTableCreate(100);
	HashTableSetDeallocationFunctions(local_reassembly_pileup_files, NULL, NULL);
	HashTableSetKeyComparisonFunction(local_reassembly_pileup_files, my_strcmp);
	HashTableSetHashFunction(local_reassembly_pileup_files ,HashTableStringHashFunction);

	geinput_open_sam(sam_file, &input_file,0);

	while(1)
	{
		unsigned int read_pos =0xffffffff;
		char read_name[MAX_READ_NAME_LEN+1];
		int flags;
		char chro_name[MAX_CHROMOSOME_NAME_LEN+1];
		unsigned int pos, pair_dist;
		char cigar[EXON_MAX_CIGAR_LEN+1];
		char read_text[MAX_READ_LENGTH+1];
		char qual_text[MAX_READ_LENGTH+1];
		int read_len, is_repeated, mapping_quality, is_anchor_certain=1;
		int pos_delta = 0;
		int is_paired_end_reads = 0;

		unsigned long long int file_offset = ftello(input_file.input_fp);
		if(feof(input_file.input_fp))break;

		read_text[0]=0;
		qual_text[0]=0;
		geinput_readline(&input_file, linebuf,0);
		int res = parse_SAM_line(linebuf, read_name,& flags, chro_name, & pos, cigar, & mapping_quality, & pair_dist, read_text , qual_text, & read_len, & is_repeated);
		int cigar_cursor = 0;
		int firstM = 1,xx=0;
		is_paired_end_reads = flags &1;
		if(res==0)
		{
			for(; cigar[cigar_cursor]; cigar_cursor++)
			{
				char nch = cigar[cigar_cursor]; 
				if(nch>='0'&&nch<='9')
				{
					xx=xx*10+(nch-'0');
				}else
				{
					if(nch=='M') firstM=0;
					else if(nch=='S')
					{
						if(firstM)
							pos_delta = xx;
					}
					xx=0;
				}
			}

			pos -= pos_delta;
		}

		if(res == 1) {chro_name[0]='*'; chro_name[1]=0;}
		//printf("MAPPED=%d\n", res);

		if(res == 0)	// mapped
		{

			read_pos = pos - 1;
			mapped++;
		}
		else if(res == 1 && is_paired_end_reads)	// unmapped
		{
			is_anchor_certain=0;
			if(mate_chro[0])
			{
				if(mate_chro[0]!='*')
				{
					read_pos = mate_pos ;
					strcpy(chro_name, mate_chro);
				}
				//printf("RECOVERED 1: %u - %s ; LEN=%d ; YOU_ARE_FIRST=%d\n%s\n%s\n", read_anchor_position,  read_name, read_len, flags_mate & SAM_FLAG_FIRST_READ_IN_PAIR, read_text, qual_text);
			}
			else
			{
				char read_text_null[MAX_READ_LENGTH+1];
				char qual_text_null[MAX_READ_LENGTH+1];

				geinput_readline_back(&input_file, linebuf);
				res = parse_SAM_line(linebuf, read_name,& flags_mate, mate_chro, & mate_pos, cigar_mate, & mapping_quality, & pair_dist, read_text_null , qual_text_null, & read_len, & is_repeated);
				if(res==0)
				{
					read_pos = mate_pos - 1;
					strcpy(chro_name, mate_chro);
				}
				//printf("RECOVERED 2: %u - %s ; LEN=%d ; YOU_ARE_FIRST=%d\n%s\n%s\n", read_anchor_position,  read_name, read_len, flags_mate & SAM_FLAG_FIRST_READ_IN_PAIR, read_text, qual_text);
			}
		}

		if(read_pos<0xffff0000)
		{

			unsigned int read_span = calculate_read_span(cigar);

			write_read_pos(chro_name, read_pos, read_len, flags, file_offset, cigar, read_span, local_reassembly_pileup_files);
			unsigned int old_max_pos = HashTableGet(chromosome_size_table, chro_name) - NULL;
			if(old_max_pos==0)
			{
				char * chro_name_new = malloc(strlen(chro_name)+1);
				strcpy(chro_name_new , chro_name);
				
				HashTablePut(chromosome_size_table, chro_name_new, NULL+read_pos + read_span+1);
			}
			else if(read_pos + read_span +1 > old_max_pos )
				HashTablePutReplace(chromosome_size_table, chro_name, NULL+read_pos + read_span+1, 0);
		}

		if(allreads %2==1)
			mate_chro[0] = 0;
		else
		{
			strcpy(mate_chro, chro_name);
			mate_pos = pos - 1;
			flags_mate = flags;
			
		}
		allreads++;

	}
	SUBREADprintf("Processed %d reads; %d mapped.\n", allreads, mapped);

	destroy_pileup_table(local_reassembly_pileup_files);


	finalise_sam_index(chromosome_size_table, sam_file);

	HashTableDestroy(chromosome_size_table);

	return 0;
}
Example #15
0
int HashTableContainsKey(const HashTable *hashTable, const void *key) {
    return (HashTableGet(hashTable, key) != NULL);
}
Example #16
0
void AsmTranslateCode(Assembler *a, AsmCode *code) {                       // 指令的編碼函數           
  char cxCode[9]="00000000";
	code->objCode = memNew(code->size*2+1);
  memset(code->objCode, '\0', code->size*2+1);                              // 目的碼為 0000…
  switch (code->type) {                                                    // 根據指令型態             
    case 'J' :                                                             // 處理 J 型指令              
      AsmCodeParse(code, a);
      sprintf(cxCode, "%8x", code->cx);
      sprintf(code->objCode, "%2x%s", code->opCode, &cxCode[2]);                 //   編出目的碼(16進位)      
      break;                                                                                        
    case 'L' :
      AsmCodeParse(code, a);
      sprintf(cxCode, "%8x", code->cx);
      sprintf(code->objCode, "%2x%x%x%s", code->opCode, code->r[0], code->r[1], &cxCode[4]);
      break;                                                               
    case 'A' :                                                             // 處理 A 型指令         
      AsmCodeParse(code, a);
      sprintf(cxCode, "%8x", code->cx);                                                                   
      sprintf(code->objCode, "%2x%x%x%x%s", code->opCode,code->r[0],code->r[1],code->r[2],&cxCode[5]);   //   編出目的碼(16進位)  
      break;                                                                                        
    case 'D' : {                                                           // 處理是資料宣告                             
      // 我們將資料宣告  RESW, RESB, WORD, BYTE 也視為一種指令,其形態為 D
      Array *tokens = code->tokens;
      char format4[]="%8x", format1[]="%2x", *format = format1;            
      switch (code->opCode) {                                              // 如果是 RESW    
        case OP_RESW:                                                      //       或 RESB 
        case OP_RESB:
          memset(code->objCode, '0', code->size*2);                              // 目的碼為 0000….         
          break;                                                           // 如果是 WORD:            
        case OP_WORD:                                                                
          format = format4;                                                // 設定輸出格式為 %8x 
        case OP_BYTE: {                                                    // 如果是 BYTE : 輸出格式為 %2x
          char *objPtr = code->objCode;
          int i=0, si;
          for (i=code->argStart; i<tokens->count; i++) {                                 
              char *item = tokens->item[i];
              if (item[0] == '"') {
                for (si=1; item[si] != '"'; si++) {
                    sprintf(objPtr, "%2x", item[si]);
                    objPtr += 2;
                }
			} else if (isdigit(item[0])) {
                sprintf(objPtr, format, atoi(item));
            } else {
                AsmCode *itemCode = HashTableGet(a->symTable, item);
                sprintf(objPtr, format, itemCode->address);
              }
//			strFree(item);
              objPtr += strlen(objPtr);
          }
          break;
        } // case OP_BYTE:
      } // switch
      break;
    } // case ' '
    default: 
      break;
  }
  strReplace(code->objCode, " ", '0');
  strToUpper(code->objCode);
}
int main(int argc, char ** argv)
{

	char * junc_table_file;
	HashTable * junc_table = HashTableCreate(337);
	HashTable * junc_table_l = HashTableCreate(337);
	HashTable * junc_table_r = HashTableCreate(337);
	HashTable * bin_table = HashTableCreate(9337);
	if(argc<2)
	{
		printf("Usage cat my.SAM | filterJunc junc.table | featureCounts -i STDIN -a myAnnot.txt \n");
		return -1;
	}

	junc_table_file = argv[1];
	if(load_junc_table(junc_table_file, junc_table, junc_table_l, junc_table_r, bin_table))
	{
		printf("Junction table not found!\n");
		return -1;
	}
	char * linebuf=malloc(5001);
	char * linebuf2=malloc(5001);
	while(1)
	{
		int support_found = 0, ii, jj, alternative_found = 0;
		char * new_line = fgets(linebuf, 5000, stdin);
		if(!new_line) break;

		if(new_line[0]=='@')
		{
			fputs(new_line, stdout);
			continue;
		}


		char * new_line2 = fgets(linebuf2, 5000, stdin);
		for(ii=0;ii<2;ii++)
		{
			int flag=0;
			char chro[20];
			unsigned int pos=0;
			char cigar[50];
			unsigned int start_points[6];
			unsigned short section_lengths[6];
			
			parse_line(ii?new_line2:new_line, &flag, chro, &pos, cigar);
			int sections = RSubread_parse_CIGAR_string(cigar, start_points, section_lengths);
			for(jj=0; jj<sections-1; jj++)
			{
				unsigned int edge1 = start_points[jj] + pos + section_lengths[jj];
				unsigned int edge2 = start_points[jj+1] + pos - 1;

				unsigned long long int junc_table_key = (edge1*1LLU) <<32 | edge2;
				char * junc_chro=HashTableGet(junc_table, (void *)junc_table_key);

				if(junc_chro && strcmp(junc_chro, chro)==0)
				{
					support_found = 1;
				}
				else
				{
					char * junc_chro_l=HashTableGet(junc_table_l, NULL+edge1); 
					char * junc_chro_2=HashTableGet(junc_table_r, NULL+edge2); 
					if(		(junc_chro_l && strcmp(junc_chro_l, chro)==0)
						||	(junc_chro_2 && strcmp(junc_chro_2, chro)==0))
					alternative_found = 1;
					
				}
			}

			//if(support_found) break;

			if(!support_found && !alternative_found)
				for(jj=0; jj<sections; jj++)
				{
					unsigned int edge2 = start_points[jj] + pos + section_lengths[jj];
					unsigned int edge1 = start_points[jj] + pos;

					unsigned int real_edge1 = HashTableGet(bin_table, NULL+edge1/50)-NULL; 
					unsigned int real_edge2 = HashTableGet(bin_table, NULL+edge2/50)-NULL;

					if(real_edge1)
					{
						long long int diff = real_edge1;
						diff -= edge1;

						if(abs(diff)<section_lengths[jj]) 
							alternative_found=1;
						// this section should contain the read_edge, but it does not! (it was a section as a whole)
					}

					if(real_edge2)
					{
						long long int diff = real_edge2;
						diff -= edge1;

						if(abs(diff)<section_lengths[jj]) 
							alternative_found=1;
						// this section should contain the read_edge, but it does not! (it was a section as a whole)
					}


				}
		}

		if(alternative_found)
		//if(support_found)
		{
			fputs( new_line, stdout);
			fputs( new_line2, stdout);
		}
		//printf("READ: (%d)  %s,%u   %s\n\n", flag2, chro2, pos2, cigar2);

	}

	free(linebuf);
	free(linebuf2);
}