Last active
December 10, 2023 09:54
PPPP_Read debugging
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
read_size = FFI::MemoryPointer.new(:int32, 1) | |
read_size.write_int32(4) | |
p2p_buffer_size = 128 * 1024 | |
input_buffer = FFI::MemoryPointer.new(:char, p2p_buffer_size, true) | |
some_obj = SandBox.new.authenticate read_size, input_buffer, 100000 | |
class SandBox | |
def authenticate(read_size, input_buffer, timeout=100000) | |
# aes_init | |
#connect or deinit | |
session_handle = connect 4 | |
puts "session handle from connect is #{session_handle}" | |
return session_handle if session_handle < 0 | |
sendStreamIOHead(session_handle, S::ENUM_STREAM_IO_TYPE[:SIO_TYPE_AUTH_REQ], 0) | |
orig_values = OpenStruct.new(input_buffer: input_buffer, read_size: read_size) | |
puts "started read" | |
start_time = Time.now | |
ret = S::S_Read(session_handle, S::P2P_CHANNEL[:P2P_CHANNEL_IOCTRL], input_buffer, read_size, timeout) | |
end_time = Time.now | |
puts "read finished" | |
puts "read took #{end_time - start_time}" | |
read_object = OpenStruct.new(session_handle: session_handle, input_buffer: input_buffer, read_size: read_size, return_value: ret, original_values: orig_values) | |
if ret < 0 | |
puts "read failure -- disconnecting and deinitializing" | |
disconnect(session_handle) | |
else | |
puts "read_successfull" | |
end | |
read_object | |
end | |
private | |
def aes_init | |
S::AES.AES_Init | |
end | |
def make_struct(struct) | |
obj_ptr = FFI::MemoryPointer.new struct, struct.size | |
struct.new(obj_ptr) # wrap ruby object around C pointer | |
end | |
def sendStreamIOHead(session_handle, control_type, size) | |
p_stream_io_head = make_struct(S::Structs::STAVStreamIOHead) | |
temp = p_stream_io_head | |
p_stream_io_head[:unionSTreamIOHead][:nStreamIOType] = control_type | |
p_stream_io_head[:unionSTreamIOHead][:nDataSize][0] = (size & 0xff) | |
p_stream_io_head[:unionSTreamIOHead][:nDataSize][1] = ((size >> 8) & 0xff) | |
p_stream_io_head[:unionSTreamIOHead][:nDataSize][2] = ((size >> 16) & 0xff) | |
S::S_Write(session_handle, S::P2P_CHANNEL[:P2P_CHANNEL_IOCTRL], temp.to_ptr, p_stream_io_head.size ) | |
end | |
def init_device | |
p2p_server_cyphertext = "ECGBFFBJKAIEGHJAEBHLFGEMHLNBHCNIGEFCBNCIBIJALMLFCFAPCHODHOLCJNKIBIMCLDCNOBMOAKDMJGNMIJBJML" | |
puts "Initializing device" | |
S.S_Initialize(p2p_server_cyphertext) | |
end | |
def connect(did=1) | |
initializer = init_device | |
puts "Initialized value is #{initializer}" | |
return "Already initialized" if initializer == -2 | |
device_id = "DOXX-000008-FGJMH" if did == 1 | |
device_id = "DOXX-000003-EZFLJ" if did == 2 | |
device_id = "CHXX-000596-XLUGT" if did == 3 | |
device_id = "DOXX-000007-UWPWD" if did == 4 | |
device_id = "DOXX-000002-EMFHV" if did == 5 | |
puts "Connecting to device #{device_id}" | |
session_handle = S.S_Connect(device_id, 1, 0) | |
puts "Checking session_handle with value of #{session_handle}" | |
session_info = make_struct(Yale::Structs::STPPPPSession) | |
s_response = S.S_Check(session_handle, session_info.pointer) | |
if s_response < 0 | |
puts "Check failure, response is #{s_response}." | |
return disconnect(session_handle) | |
end | |
puts "Session handled check successful" | |
# session_info_b_mode = session_info[:b_mode] == 0 ? "P2P" : "RLY" | |
# puts "----------Session(#{session_handle}) Ready: #{session_info_b_mode}----------" | |
# puts "Socket : #{session_info[:skt]}" | |
# puts "Remote Addr : #{session_info[:remote_address][:addr]}:#{session_info[:remote_address][:port]}" | |
# puts "My Lan Addr : #{session_info[:my_local_address][:addr]}:#{session_info[:my_local_address][:port]}" | |
# puts "My Wan Addr : #{session_info[:my_wan_address][:addr]}:#{session_info[:my_wan_address][:port]}" | |
# puts "Connection time : #{session_info[:connection_time]} second before" | |
# puts "DID : #{session_info[:did]}" | |
# puts "I am #{session_info}", (session_info.bCorD ==0) ? "Client" : "Device" | |
# puts "Connection mode: #{session_info_b_mode}" | |
# puts "----------End of Session info :----------" | |
session_handle | |
end | |
def disconnect(session_handle, hard_disconnect=false) | |
if hard_disconnect | |
puts "Disconnecting device. Force closing session handle ##{session_handle}" | |
S.S_ForceClose(session_handle) | |
else | |
puts "Disconnecting device. Closing session handle ##{session_handle}" | |
S.S_Close(session_handle) | |
end | |
deinit_device | |
end | |
def deinit_device | |
puts "Deinitializing..." | |
S.S_DeInitialize | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module S | |
extend FFI::Library | |
ffi_lib Sample.ffi_lib_path, FFI::Library::LIBC | |
P2P_CHANNEL = enum(:P2P_CHANNEL_IOCTRL, | |
:P2P_CHANNEL_DATA, | |
:P2P_CHANNEL_AVDATA_CtoD, | |
:P2P_CHANNEL_DATA_PLAYBACK, | |
:P2P_CHANNEL_FILE_DOWNLOAD ) | |
AUTH_TYPE = enum(:AUTH_TYPE_UNKN, | |
:AUTH_TYPE_REQ, | |
:AUTH_TYPE_RESP, | |
:AUTH_TYPE_OK, | |
:AUTH_TYPE_FAILED ) | |
MENU_ITEM = enum(:MENU_ITEM_EXIT, | |
:MENU_ITEM_GET_VIDEO_FRAME, | |
:MENU_ITEM_GET_AUDIO_FRAME, | |
:MENU_ITEM_GET_VIDEO_AUDIO_FRAME, | |
:MENU_ITEM_GET_DEVICE_INFO, | |
:MENU_ITEM_DUMP_VIDEO_FRAME, | |
:MENU_ITEM_DUMP_AUDIO_FRAME, | |
:MENU_ITEM_DUMP_VIDEO_AUDIO_FRAME, | |
:MENU_ITEM_SEND_AUDIO_DATA, | |
:MENU_ITEM_VEDIO_RESOLUTION, | |
:MENU_ITEM_VEDIO_FRAME_RAME, | |
:MENU_ITEM_VEDIO_BRIGHTNESS, | |
:MENU_ITEM_VEDIO_BITRATE, | |
:MENU_ITEM_CONTRAST, | |
:MENU_ITEM_SATURATION, | |
:MENU_ITEM_INFRARED, | |
:MENU_ITEM_FLIP, | |
:MENU_ITEM_MIRROR, | |
:MENU_ITEM_RECODE_STATUS, | |
:MENU_ITEM_RECODE_MODE, | |
:MENU_ITEM_RECODE_CYCLE_TIME, | |
:MENU_ITEM_RECODE_DATE_TIME, | |
:MENU_ITEM_PHOTO_CAPTURE, | |
:MENU_ITEM_GET_PICTURE, | |
:MENU_ITEM_GET_RECORD, | |
:MENU_ITEM_SET_PASSWORD, | |
:MENU_ITEM_SET_DID, | |
:MENU_ITEM_SET_AP_SSID, | |
:MENU_ITEM_SET_AP_PASSWORD, | |
:MENU_ITEM_UPDATE_FW ) | |
ENUM_STREAM_IO_TYPE = enum(:SIO_TYPE_AUTH, 1, | |
:SIO_TYPE_VIDEO, | |
:SIO_TYPE_AUDIO, | |
:SIO_TYPE_IOCTRL, | |
:SIO_TYPE_FILE, | |
:SIO_TYPE_AUTH_REQ) | |
ENUM_CODECID = enum(:CODECID_UNKN, | |
:CODECID_V_MJPEG, | |
:CODECID_V_MPEG4, | |
:CODECID_V_H264, | |
:CODECID_A_PCM, 0x4FF, | |
:CODECID_A_ADPCM, | |
:CODECID_A_SPEEX, | |
:CODECID_A_AMR, | |
:CODECID_A_AAC) | |
ENUM_VFRAME = enum(:VFRAME_FLAG_I, :VFRAME_FLAG_P, :VFRAME_FLAG_B) | |
ENUM_AUDIO_SAMPLERATE = enum(:ASAMPLE_RATE_8K, | |
:ASAMPLE_RATE_11K, | |
:ASAMPLE_RATE_12K, | |
:ASAMPLE_RATE_16K, | |
:ASAMPLE_RATE_22K, | |
:ASAMPLE_RATE_24K, | |
:ASAMPLE_RATE_32K, | |
:ASAMPLE_RATE_44K, | |
:ASAMPLE_RATE_48K) | |
ENUM_AUDIO_DATABITS = enum(:ADATABITS_8, :ADATABITS_16) | |
ENUM_AUDIO_CHANNEL = enum(:ACHANNEL_MONO, :ACHANNEL_STERO) | |
ENUM_PTZ_COMMAND = enum(:IOCTRL_PTZ_STOP, | |
:IOCTRL_PTZ_UP, | |
:IOCTRL_PTZ_DOWN , | |
:IOCTRL_PTZ_LEFT , | |
:IOCTRL_PTZ_RIGHT, | |
:IOCTRL_PTZ_LEFT_UP, | |
:IOCTRL_PTZ_LEFT_DOWN , | |
:IOCTRL_PTZ_RIGHT_UP, | |
:IOCTRL_PTZ_RIGHT_DOWN, | |
:IOCTRL_LENS_ZOOM_IN , | |
:IOCTRL_LENS_ZOOM_OUT, | |
:IOCTRL_PTZ_AUTO_SCAN, | |
:IOCTRL_PTZ_PRESET_POINT, | |
:IOCTRL_PTZ_SET_PRESET_POINT) | |
ENUM_VIDEO_RESOLUTION = enum(:VGA, :HD) | |
ENUM_VIDEO_FRAME_RATE = enum(:FIVE, :TEN, :FIFTEEN, :TWENTY, :TWENTY_FIVE, :THIRTY) | |
ENUM_VIDEO_SETTING = enum(:ON, :OFF, :AUTO, :PHOTO, :VIDEO, :READ, :SET) | |
ENUM_FRAMERATE = enum(:FRAME_5, :FRAME_10, :FRAME_15, :FRAME_20, :FRAME_25, :FRAME_30) | |
ENUM_BITRATE = enum(:BITRATE_512, :BITRATE_1024, :BITRATE_1536, :BITRATE_2048, :BITRATE_3072, :BITRATE_4096) | |
ENUM_FLIP = enum(:NO_FLIP, :FLIP) | |
ENUM_MIRROR = enum(:NO_MIRROR, :MIRROR) | |
ENUM_IOCTRL_TYPE = enum(:IOCTRL_TYPE_PUSH_CamIndex, | |
:IOCTRL_TYPE_VIDEO_START, | |
:IOCTRL_TYPE_VIDEO_STOP, | |
:IOCTRL_TYPE_AUDIO_START, | |
:IOCTRL_TYPE_AUDIO_STOP, | |
:IOCTRL_TYPE_DEVINFO_REQ, | |
:IOCTRL_TYPE_DEVINFO_RESP, | |
:IOCTRL_TYPE_RECORD_PLAYCONTROL_REQ, | |
:IOCTRL_TYPE_RECORD_PLAYCONTROL_RESP, | |
:IOCTRL_TYPE_PTZ_COMMAND, | |
:IOCTRL_TYPE_LISTEVENT_REQ, | |
:IOCTRL_TYPE_LISTEVENT_RESP, | |
:IOCTRL_TYPE_EVENT_NOTIFY, | |
:IOCTRL_TYPE_EMAIL_ON_OFF_REQ, | |
:IOCTRL_TYPE_EMAIL_ON_OFF_RESP, | |
:IOCTRL_TYPE_EVENT_NOTIFY_ON_OFF_REQ, | |
:IOCTRL_TYPE_EVENT_NOTIFY_ON_OFF_RESP, | |
:IOCTRL_TYPE_GET_ON_OFF_VALUE_REQ, | |
:IOCTRL_TYPE_GET_ON_OFF_VALUE_RESP, | |
:IOCTRL_TYPE_SPEAKER_START, | |
:IOCTRL_TYPE_SPEAKER_STOP, | |
:IOCTRL_TYPE_SETPASSWORD_REQ, | |
:IOCTRL_TYPE_SETPASSWORD_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_PARAMETER_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_PARAMETER_RESP, | |
:IOCTRL_TYPE_GET_VIDEO_PARAMETER_REQ, | |
:IOCTRL_TYPE_GET_VIDEO_PARAMETER_RESP, | |
:IOCTRL_TYPE_LISTWIFIAP_REQ, | |
:IOCTRL_TYPE_LISTWIFIAP_RESP, | |
:IOCTRL_TYPE_SETWIFI_REQ, | |
:IOCTRL_TYPE_SETWIFI_RESP, | |
:IOCTRL_TYPE_SETMOTIONDETECT_REQ, | |
:IOCTRL_TYPE_SETMOTIONDETECT_RESP, | |
:IOCTRL_TYPE_GETMOTIONDETECT_REQ, | |
:IOCTRL_TYPE_GETMOTIONDETECT_RESP, | |
:IOCTRL_TYPE_SETRECORD_REQ, | |
:IOCTRL_TYPE_SETRECORD_RESP, | |
:IOCTRL_TYPE_GETRECORD_REQ, | |
:IOCTRL_TYPE_GETRECORD_RESP, | |
:IOCTRL_TYPE_FORMATEXTSTORAGE_REQ, | |
:IOCTRL_TYPE_FORMATEXTSTORAGE_RESP, | |
:IOCTRL_TYPE_MANU_REC_START, | |
:IOCTRL_TYPE_MANU_REC_STOP, | |
:IOCTRL_TYPE_SET_EMAIL_REQ, | |
:IOCTRL_TYPE_SET_EMAIL_RESP, | |
:IOCTRL_TYPE_GET_EMAIL_REQ, | |
:IOCTRL_TYPE_GET_EMAIL_RESP, | |
:IOCTRL_TYPE_AUTH_ADMIN_PASSWORD_REQ, | |
:IOCTRL_TYPE_AUTH_ADMIN_PASSWORD_RESP, | |
:IOCTRL_TYPE_SET_ADMIN_PASSWORD_REQ, | |
:IOCTRL_TYPE_SET_ADMIN_PASSWORD_RESP, | |
:IOCTRL_TYPE_GETWIFI_REQ, | |
:IOCTRL_TYPE_GETWIFI_RESP, | |
:IOCTRL_TYPE_PUSH_APP_UTC_TIME, | |
:IOCTRL_TYPE_SET_TIMEZONE_REQ, | |
:IOCTRL_TYPE_SET_TIMEZONE_RESP, | |
:IOCTRL_TYPE_GET_TIMEZONE_REQ, | |
:IOCTRL_TYPE_GET_TIMEZONE_RESP, | |
:IOCTRL_TYPE_APNS_SET_TOKENID_REQ, | |
:IOCTRL_TYPE_APNS_SET_TOKENID_RESP, | |
:IOCTRL_TYPE_APNS_SET_CERT_REQ, | |
:IOCTRL_TYPE_APNS_SET_CERT_RESP, | |
:IOCTRL_TYPE_APNS_PUSH_IP_REQ, | |
:IOCTRL_TYPE_APNS_PUSH_IP_RESP, | |
:IOCTRL_TYPE_AUTO_DEL_REC_ON_OFF_REQ, | |
:IOCTRL_TYPE_SETDETECTMODE_REQ, | |
:IOCTRL_TYPE_SETDETECTMODE_RESP, | |
:IOCTRL_TYPE_GETDETECTMODE_REQ, | |
:IOCTRL_TYPE_GETDETECTMODE_RESP, | |
:IOCTRL_TYPE_SET_APNS_SERVER_PUSH_REQ, | |
:IOCTRL_TYPE_SET_APNS_SERVER_PUSH_RESP, | |
:IOCTRL_TYPE_GET_APNS_SERVER_PUSH_REQ, | |
:IOCTRL_TYPE_GET_APNS_SERVER_PUSH_RESP, | |
:IOCTRL_TYPE_SET_MOTION_SENSITIVITY_REQ, | |
:IOCTRL_TYPE_SET_MOTION_SENSITIVITY_RESP, | |
:IOCTRL_TYPE_GET_MOTION_SENSITIVITY_REQ, | |
:IOCTRL_TYPE_GET_MOTION_SENSITIVITY_RESP, | |
:IOCTRL_TYPE_SET_SYSTEM_REBOOT_REQ, | |
:IOCTRL_TYPE_SET_SYSTEM_REBOOT_RESP, | |
:IOCTRL_TYPE_SET_DEVICE_CUSTOM_INFO_REQ, | |
:IOCTRL_TYPE_SET_DEVICE_CUSTOM_INFO_RESP, | |
:IOCTRL_TYPE_GET_DEVICE_CUSTOM_INFO_REQ, | |
:IOCTRL_TYPE_GET_DEVICE_CUSTOM_INFO_RESP, | |
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_STATUS_REQ, | |
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_STATUS_RESP, | |
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_REQ, | |
:IOCTRL_TYPE_SEND_FIRMWARE_IMAGE_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_DWDR_SWITCH_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_DWDR_SWITCH_RESP, | |
:IOCTRL_TYPE_GET_VIDEO_DWDR_SWITCH_REQ, | |
:IOCTRL_TYPE_GET_VIDEO_DWDR_SWITCH_RESP, | |
:IOCTRL_TYPE_GET_ONET_DEVINFO_REQ, | |
:IOCTRL_TYPE_GET_ONET_DEVINFO_RESP, | |
:IOCTRL_TYPE_SET_ONET_DEVINFO_REQ, | |
:IOCTRL_TYPE_SET_ONET_DEVINFO_RESP, | |
:IOCTRL_TYPE_SET_ONET_STATUS_REQ , | |
:IOCTRL_TYPE_SET_ONET_STATUS_RESP, | |
:IOCTRL_TYPE_REMOVE_EVENTLIST_REQ, | |
:IOCTRL_TYPE_REMOVE_EVENTLIST_RESP, | |
:IOCTRL_TYPE_REMOVE_EVENT_REQ, | |
:IOCTRL_TYPE_REMOVE_EVENT_RESP, | |
:IOCTRL_TYPE_UPGRADE_FIRMWARE_REQ, | |
:IOCTRL_TYPE_UPGRADE_FIRMWARE_RESP, | |
:IOCTRL_TYPE_GET_VIDEO_BRIGHTNESS_REQ, | |
:IOCTRL_TYPE_GET_VIDEO_BRIGHTNESS_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_BRIGHTNESS_REQ , | |
:IOCTRL_TYPE_SET_VIDEO_BRIGHTNESS_RESP, | |
:IOCTRL_TYPE_GET_VIDEO_CONTRAST_REQ, | |
:IOCTRL_TYPE_GET_VIDEO_CONTRAST_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_CONTRAST_REQ , | |
:IOCTRL_TYPE_SET_VIDEO_CONTRAST_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_DWDR_INTENSITY_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_DWDR_INTENSITY_RESP, | |
:IOCTRL_TYPE_GET_VIDEO_DWDR_INTENSITY_REQ, | |
:IOCTRL_TYPE_GET_VIDEO_DWDR_INTENSITY_RESP, | |
:IOCTRL_TYPE_MPTEST_GPIO_REQ, | |
:IOCTRL_TYPE_MPTEST_GPIO_RESP, | |
:IOCTRL_TYPE_MPTEST_RESETPIN_REQ, | |
:IOCTRL_TYPE_MPTEST_RESETPIN_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_RESOLUTION_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_RESOLUTION_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_FRAME_RATE_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_FRAME_RATE_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_BITRATE_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_BITRATE_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_SATURATION_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_SATURATION_RESP, | |
:IOCTRL_TYPE_SET_INFRARED_REQ, | |
:IOCTRL_TYPE_SET_INFRARED_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_FLIP_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_FLIP_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_MIRROR_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_MIRROR_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_STATUS_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_STATUS_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_MODE_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_MODE_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_CYCLE_TIME_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_CYCLE_TIME_RESP, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_DATE_TIME_REQ, | |
:IOCTRL_TYPE_SET_VIDEO_RECORD_DATE_TIME_RESP, | |
:IOCTRL_TYPE_SET_PHOTO_CAPTURE_REQ, | |
:IOCTRL_TYPE_SET_PHOTO_CAPTURE_RESP, | |
:IOCTRL_TYPE_GET_PICTURE_REQ, | |
:IOCTRL_TYPE_GET_PICTURE_RESP, | |
:IOCTRL_TYPE_SET_DID_REQ, | |
:IOCTRL_TYPE_SET_DID_RESP, | |
:IOCTRL_TYPE_SET_STA_SSID_REQ, | |
:IOCTRL_TYPE_SET_STA_SSID_RESP, | |
:IOCTRL_TYPE_SET_STA_PASSWORD_REQ, | |
:IOCTRL_TYPE_SET_STA_PASSWORD_RESP) | |
attach_function :S_GetAPIVersion, [], :uint32 | |
attach_function :S_QueryDID, [:string, :char, :int32], :int32 | |
attach_function :S_Initialize, [:pointer], :int32 | |
attach_function :S_DeInitialize, [], :int32 | |
attach_function :S_NetworkDetect, [:pointer, :uint16], :int32 | |
attach_function :S_NetworkDetectByServer, [:pointer, :uint16, :pointer], :int32 | |
attach_function :S_Share_Bandwidth, [:char], :int32 | |
attach_function :S_Listen, [:string, :uint32, :uint16, :char, :string], :int32 | |
attach_function :S_Listen_Break, [], :int32 | |
attach_function :S_LoginStatus_Check, [:pointer], :int32 | |
attach_function :S_Connect, [:string, :char, :uint16], :int32 | |
attach_function :S_ConnectByServer, [:string, :char, :uint16, :pointer], :int32 | |
attach_function :S_Connect_Break, [],:int32 | |
attach_function :S_Check, [:int32, :pointer], :int32 | |
attach_function :S_Close, [:int32], :int32 | |
attach_function :S_ForceClose, [:int32], :int32 | |
attach_function :S_Write, [:int32, :uchar, :pointer, :int32], :int32 | |
# S_API_API INT32 S_Read(INT32 SessionHandle, UCHAR Channel, CHAR *DataBuf, INT32 *DataSize, UINT32 TimeOut_ms); | |
attach_function :S_Read, [:int32, :uchar, :pointer, :pointer, :uint32], :int32 | |
attach_function :S_Check_Buffer, [:int32, :uchar, :pointer, :pointer], :int32 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment