|  |  |  | @ -81,7 +81,12 @@ static const struct hook_symbol cm_syms[] = { | 
		
	
		
			
				|  |  |  |  |     }, | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | HRESULT es3sec_hook_init(const struct es3sec_config *cfg, USHORT vid, USHORT pid, wchar_t *manufacturer, wchar_t *product) | 
		
	
		
			
				|  |  |  |  | HRESULT es3sec_hook_init( | 
		
	
		
			
				|  |  |  |  |     const struct es3sec_config *cfg,  | 
		
	
		
			
				|  |  |  |  |     USHORT vid,  | 
		
	
		
			
				|  |  |  |  |     USHORT pid, | 
		
	
		
			
				|  |  |  |  |     const wchar_t *manufacturer,  | 
		
	
		
			
				|  |  |  |  |     const wchar_t *product) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     HRESULT hr; | 
		
	
		
			
				|  |  |  |  |     assert(cfg != NULL); | 
		
	
	
		
			
				
					
					|  |  |  | @ -111,13 +116,19 @@ HRESULT es3sec_hook_init(const struct es3sec_config *cfg, USHORT vid, USHORT pid | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     CM_Locate_DevNodeW(&root_dev_inst, NULL, CM_LOCATE_DEVNODE_NORMAL); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: init\tVID %x PID %x\n", vid, pid); | 
		
	
		
			
				|  |  |  |  |     dongle_vid = vid; | 
		
	
		
			
				|  |  |  |  |     dongle_pid = pid; | 
		
	
		
			
				|  |  |  |  |     wcscpy_s(dongle_mftr, _countof(manufacturer), manufacturer); | 
		
	
		
			
				|  |  |  |  |     wcscpy_s(dongle_product, _countof(product), product); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     wcscpy_s(dongle_mftr, _countof(dongle_mftr), manufacturer); | 
		
	
		
			
				|  |  |  |  |     wcscpy_s(dongle_product, _countof(dongle_product), product); // Invalid param? | 
		
	
		
			
				|  |  |  |  |     memcpy(&config, cfg, sizeof(*cfg)); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: init\tVID: %04X | PID: %04X | Manufacturer: %ls | Product: %ls | S/N: %ls\n",  | 
		
	
		
			
				|  |  |  |  |         vid,  | 
		
	
		
			
				|  |  |  |  |         pid,  | 
		
	
		
			
				|  |  |  |  |         dongle_mftr,  | 
		
	
		
			
				|  |  |  |  |         dongle_product,  | 
		
	
		
			
				|  |  |  |  |         config.serial); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     return S_OK; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -192,23 +203,21 @@ static HRESULT es3sec_hub_handle_driverkey(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |     ULONG actual_length = size_of_driver_key + sizeof(USB_ROOT_HUB_NAME); | 
		
	
		
			
				|  |  |  |  |     HRESULT hr; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     if (irp->write.nbytes == sizeof(USB_HCD_DRIVERKEY_NAME)) | 
		
	
		
			
				|  |  |  |  |     if (irp->write.nbytes == sizeof(USB_HCD_DRIVERKEY_NAME)) // Requesting key size | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get Hub Driver Key size\n"); | 
		
	
		
			
				|  |  |  |  |         USB_HCD_DRIVERKEY_NAME usb_hcd_driver_key_name; | 
		
	
		
			
				|  |  |  |  |         usb_hcd_driver_key_name.ActualLength = actual_length; | 
		
	
		
			
				|  |  |  |  |         hr = iobuf_write(&irp->read, &usb_hcd_driver_key_name, sizeof(usb_hcd_driver_key_name)); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         if (FAILED(hr)) | 
		
	
		
			
				|  |  |  |  |         { | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: es3sec_hub_handle_driverkey iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |         return hr; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Driver Key\n"); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     // Requesting the key itself | 
		
	
		
			
				|  |  |  |  |     PUSB_HCD_DRIVERKEY_NAME usb_hcd_driver_key_name = (PUSB_HCD_DRIVERKEY_NAME)malloc(sizeof(USB_HCD_DRIVERKEY_NAME) + actual_length); | 
		
	
		
			
				|  |  |  |  |     usb_hcd_driver_key_name->ActualLength = actual_length; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -227,7 +236,7 @@ static HRESULT es3sec_hub_handle_driverkey(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     if (FAILED(hr)) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: es3sec_hub_handle_driverkey iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     return hr; | 
		
	
	
		
			
				
					
					|  |  |  | @ -239,20 +248,19 @@ static HRESULT es3sec_hub_handle_roothub(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |     ULONG actual_length = size_of_hub_name + sizeof(USB_ROOT_HUB_NAME); | 
		
	
		
			
				|  |  |  |  |     HRESULT hr; | 
		
	
		
			
				|  |  |  |  |     | 
		
	
		
			
				|  |  |  |  |     if (irp->read.nbytes == sizeof(USB_ROOT_HUB_NAME)) {         | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get Hub Root Hub Name size\n"); | 
		
	
		
			
				|  |  |  |  |     if (irp->read.nbytes == sizeof(USB_ROOT_HUB_NAME)) { // Root hub name size | 
		
	
		
			
				|  |  |  |  |         USB_ROOT_HUB_NAME rhub; | 
		
	
		
			
				|  |  |  |  |         rhub.ActualLength = actual_length; | 
		
	
		
			
				|  |  |  |  |         hr = iobuf_write(&irp->read, &rhub, sizeof(rhub)); | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         if (FAILED(hr)) { | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: es3sec_hub_handle_roothub iobuf_write failed! %lx\n", hr); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         return hr; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Root Hub Name\n"); | 
		
	
		
			
				|  |  |  |  |     //Root hub name | 
		
	
		
			
				|  |  |  |  |     PUSB_ROOT_HUB_NAME rhub = (PUSB_ROOT_HUB_NAME)malloc(actual_length); | 
		
	
		
			
				|  |  |  |  |     rhub->ActualLength = actual_length; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -278,7 +286,6 @@ static HRESULT es3sec_hub_handle_roothub(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | static HRESULT es3sec_hub_handle_nodeinfo(struct irp *irp) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Node Information\n"); | 
		
	
		
			
				|  |  |  |  |     USB_NODE_INFORMATION node_info; | 
		
	
		
			
				|  |  |  |  |     node_info.NodeType = UsbHub; | 
		
	
		
			
				|  |  |  |  |     node_info.u.HubInformation.HubDescriptor.bNumberOfPorts = 1; | 
		
	
	
		
			
				
					
					|  |  |  | @ -303,7 +310,6 @@ static HRESULT es3sec_hub_connection_info_ex(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |         return hr; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Connection Info EX\tConnectionIndex %ld\n", conn_info->ConnectionIndex); | 
		
	
		
			
				|  |  |  |  |     conn_info->ConnectionStatus = DeviceConnected; | 
		
	
		
			
				|  |  |  |  |     conn_info->DeviceIsHub = false; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -342,8 +348,10 @@ static HRESULT es3sec_hub_descriptor_from_node(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |     switch (req_type) { | 
		
	
		
			
				|  |  |  |  |         case USB_CONFIGURATION_DESCRIPTOR_TYPE: | 
		
	
		
			
				|  |  |  |  |             return es3sec_hub_get_config_descriptor(irp, req, req_data_requested); | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         case USB_STRING_DESCRIPTOR_TYPE: | 
		
	
		
			
				|  |  |  |  |             return es3sec_hub_get_string_descriptor(irp, req, req_data_requested); | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         default: | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: es3sec_hub_descriptor_from_node Unknown request type %x\n", req_type); | 
		
	
		
			
				|  |  |  |  |             return HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION); | 
		
	
	
		
			
				
					
					|  |  |  | @ -358,7 +366,7 @@ static HRESULT es3sec_hub_descriptor_from_node(struct irp *irp) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | static HRESULT es3sec_hub_get_config_descriptor(struct irp *irp, PUSB_DESCRIPTOR_REQUEST req, UCHAR dataRequested) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Config Descriptor from Node Connection\twLength %d\n", req->SetupPacket.wLength); | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub Config Descriptor from Node Connection\n"); | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     PUSB_CONFIGURATION_DESCRIPTOR config = (PUSB_CONFIGURATION_DESCRIPTOR)malloc(sizeof(USB_CONFIGURATION_DESCRIPTOR)); | 
		
	
		
			
				|  |  |  |  |     config->bLength = sizeof(*config); | 
		
	
	
		
			
				
					
					|  |  |  | @ -374,7 +382,6 @@ static HRESULT es3sec_hub_get_config_descriptor(struct irp *irp, PUSB_DESCRIPTOR | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | static HRESULT es3sec_hub_get_string_descriptor(struct irp *irp, PUSB_DESCRIPTOR_REQUEST req, UCHAR dataRequested) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Get Hub String Descriptor from Node Connection\tdataRequested %d\n", dataRequested); | 
		
	
		
			
				|  |  |  |  |     PUSB_STRING_DESCRIPTOR str_desc; | 
		
	
		
			
				|  |  |  |  |     int additional_length = sizeof(FILLER_LANGIDS); | 
		
	
		
			
				|  |  |  |  |     str_desc = (PUSB_STRING_DESCRIPTOR)malloc(sizeof(USB_STRING_DESCRIPTOR) + additional_length); | 
		
	
	
		
			
				
					
					|  |  |  | @ -383,18 +390,23 @@ static HRESULT es3sec_hub_get_string_descriptor(struct irp *irp, PUSB_DESCRIPTOR | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     switch (dataRequested) { | 
		
	
		
			
				|  |  |  |  |         case DONGLE_STR_IDX_MANUFACTURER: | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: Get Hub String Descriptor For Dongle Manufacturer\n"); | 
		
	
		
			
				|  |  |  |  |             additional_length = sizeof(dongle_mftr); | 
		
	
		
			
				|  |  |  |  |             str_desc = (PUSB_STRING_DESCRIPTOR)realloc(str_desc, sizeof(USB_STRING_DESCRIPTOR) + additional_length); | 
		
	
		
			
				|  |  |  |  |             str_desc->bDescriptorType = USB_STRING_DESCRIPTOR_TYPE; | 
		
	
		
			
				|  |  |  |  |             wcscpy_s(str_desc->bString, _countof(dongle_mftr), dongle_mftr); | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         case DONGLE_STR_IDX_PRODUCT: | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: Get Hub String Descriptor For Dongle Product Name\n"); | 
		
	
		
			
				|  |  |  |  |             additional_length = sizeof(dongle_product); | 
		
	
		
			
				|  |  |  |  |             str_desc = (PUSB_STRING_DESCRIPTOR)realloc(str_desc, sizeof(USB_STRING_DESCRIPTOR) + additional_length); | 
		
	
		
			
				|  |  |  |  |             str_desc->bDescriptorType = USB_STRING_DESCRIPTOR_TYPE; | 
		
	
		
			
				|  |  |  |  |             wcscpy_s(str_desc->bString, _countof(dongle_product), dongle_product); | 
		
	
		
			
				|  |  |  |  |             break; | 
		
	
		
			
				|  |  |  |  |          | 
		
	
		
			
				|  |  |  |  |         case DONGLE_STR_IDX_SERIAL_NUMBER: | 
		
	
		
			
				|  |  |  |  |             dprintf("ES3 Dongle: Get Hub String Descriptor For Dongle Serial Number\n"); | 
		
	
		
			
				|  |  |  |  |             additional_length = sizeof(L"000000000000"); | 
		
	
		
			
				|  |  |  |  |             str_desc = (PUSB_STRING_DESCRIPTOR)realloc(str_desc, sizeof(USB_STRING_DESCRIPTOR) + additional_length); | 
		
	
		
			
				|  |  |  |  |             str_desc->bDescriptorType = USB_STRING_DESCRIPTOR_TYPE; | 
		
	
	
		
			
				
					
					|  |  |  | @ -477,13 +489,12 @@ static CONFIGRET my_CM_Get_DevNode_Registry_PropertyW( | 
		
	
		
			
				|  |  |  |  |     switch (ulProperty) | 
		
	
		
			
				|  |  |  |  |     { | 
		
	
		
			
				|  |  |  |  |     case CM_DRP_DEVICEDESC: | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get hub device description\n"); | 
		
	
		
			
				|  |  |  |  |         // wcscpy_s(Buffer, _countof(L"Disk drive"), L"Disk drive"); | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get Hub Device Description\n"); | 
		
	
		
			
				|  |  |  |  |         wcscpy_s(Buffer, _countof(L"Fake USB Hub"), L"Fake USB Hub"); | 
		
	
		
			
				|  |  |  |  |         break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     case CM_DRP_DRIVER: | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get hub driver\n"); | 
		
	
		
			
				|  |  |  |  |         dprintf("ES3 Dongle: Get Hub Driver Key\n"); | 
		
	
		
			
				|  |  |  |  |         wcscpy_s(Buffer, _countof(HUB_HCD_DRIVER_KEY), HUB_HCD_DRIVER_KEY); | 
		
	
		
			
				|  |  |  |  |         break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
	
		
			
				
					
					|  |  |  | @ -502,7 +513,6 @@ static CONFIGRET my_CM_Get_Child(PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG u | 
		
	
		
			
				|  |  |  |  |         return next_CM_Get_Child(pdnDevInst, dnDevInst, ulFlags); | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  |     dprintf("ES3 Dongle: Adding fake hub to root node\n"); | 
		
	
		
			
				|  |  |  |  |     *pdnDevInst = HUB_DEVINST; | 
		
	
		
			
				|  |  |  |  |     return CR_SUCCESS; | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					
					| 
							
							
							
						 |  |  | 
 |