Stack-frames of QueueUserAPC and SleepEx

KERNELBASE! QueueUserAPC https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-queueuserapc https://repnz.github.io/posts/apc/user-apc/ KERNELBASE!QueueUserAPC KERNELBASE!__imp_RtlQueryInformationActivationContext KERNELBASE!__imp_NtQueueApcThreadEx2 -> syscall KERNELBASE!SleepEx https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleepex KERNELBASE!SleepEx KERNELBASE!__imp_RtlActivateActivationContextUnsafeFast ntdll!RtlDelayExecution ntdll!NtDelayExecution -> syscall ntdll!KiUserApcDispatch ntdll!KiUserCallForwarder ntdll!RtlDispatchAPC ntdll!RtlActivateActivationContextUnsafeFast ntdll!_guard_dispatch_icall$thunk$10345483385596137414 (APCQueue!APCProc) -> jmp APCQueue!APCProc ntdll!RtlDeactivateActivationContextUnsafeFast ntdll!RtlReleaseActivationContext ntdll!NtContinueEx (7ffc907e0c50) -> syscall -> ntdll!KiUserApcDispatch APC큐가 empty 될 때까지 반복 호출 KERNELBASE!WriteFileEx WriteFileEx function (fileapi.h) - ...

레드-블랙 트리 시각화 프로그램

이미지
  Red-black Tree Visualizer 프로그램 시연 영상

RGSS Color 직렬구조 메모

이미지
https://github.com/zh99998/OpenRGSS/blob/master/lib/openrgss/color.rb#L60 Color 클래스는 Animations.rxdata 에서 사용하고 있었다. 그리고 예상과 달리  놀랍게도 R, G, B, A는 각각 1바이트 unsigned 정수가 아니라 IEEE754 표준  64비트 부동소수점 이었다. 0x000001A81BA40093  3a 0a 43 6f 6c 6f 72 25   :.Color % 0x000001A81BA4009B  00 00 00 00 00 e0 6f 40   .....?o@ 0x000001A81BA400A3  00 00 00 00 00 e0 6f 40   .....?o@ 0x000001A81BA400AB  00 00 00 00 00 e0 6f 40   .....?o@ 0x000001A81BA400B3  00 00 00 00 00 e0 6f 40   .....?o@ 0x25 = 37 - 5(\x5) = 총 32 바이트 00 00 00 00 00 e0 6f 40  -> Red:    0x 40 6f e0 00 00 00 00 00 00 00 00 00 00 e0 6f 40   -> Green: 0x 40 6f e0 00 00 00 00 00 00 00 00 00 00 e0 6f 40   -> Blue:   0x 40 6f e0 00 00 00 00 00 00 00 00 00 00 e0 6f 40   -> Alpha: 0x 40 6f e0 00 00 00 00 00 0x 40 6f e0 00 00 00 00 00를 10진수로  변환하면 255가 나온다.

2024 다녀온 곳

이미지
2024년 5월 제주도

RGSS Table 직렬구조 메모

https://github.com/zh99998/OpenRGSS/blob/master/lib/openrgss/table.rb#L49 OpenRGSS의 unpack 코드를 참고하여 Table 구조의 바이트 구조를 정리했다. ... 0x000001D992EEF216  75 3a 0a 54 61 62 6c 65  u:.Table 0x000001D992EEF21E  02   1c 07 03 00 00 00 14   ........ 0x000001D992EEF226  00 00 00 0f 00 00 00 03   ........ 0x000001D992EEF22E  00 00 00 84 03 00 00 4c  ...?...L ... 02  = 총 데이터 크기의, 자료형 크기 (2바이트) 1c 07 = 0x71c = 1820B = 20 + 1800 = 4Byte * 5개 + 2Byte * 900개 = 총 데이터 크기 03 00 00 00  = 0x3 = @size = 3 = 3차원 배열 14  00 00 00  = 0x14 =  @xsize = 20 = 맵 가로 길이 0f 00 00 00  = 0xf =  @ysize = 15 = 맵 세로 길이 03  00 00 00  = 0x3 =  @zsize = 3 = 맵 레이어 개수 84 03 00 00  = 0x384 =  @xsize * @ysize * @zsize =  900 = 타일 id 개수 4c 00 ... =  이후 2바이트씩 900개의 타일 id가 직렬로 나옴 (레이어#1: 300개, 레이어#2: 300개, 레이어#3: 300개) 아래는 Table을 불러오는 코드 작성 후 결과이다. Start reading "marshals/Data/Map001.rxdata" object of class RP...

Ruby Marshal 바이너리 파일을 읽는 C++ 프로그램을 개발 중

이미지
Ruby의 Marshal(직렬화)된 포맷 바이너리를 읽어서 출력하는 C++ 프로그램 을 만들고 있다. 몇몇 루비 토큰(Ruby 자료형을 구분하는 1개의 문자)들은 아직 처리하지 못했다. 대표적으로 USER_DEF 토큰이 그렇다. 토큰 정보는 아래 링크에서 많은 도움을 얻었다. https://docs.ruby-lang.org/en/2.1.0/marshal_rdoc.html 아래는 C++ 출력 결과이다. Start reading "marshals/marshal/game_system_instance.rxdata" object of class Game_System   :@encounter_disabled   false   :@magic_number   66   :@timer   99   :@save_count   77   :@map_interpreter   object of class Interpreter     :@wait_count     0     :@depth     0     :@branch     {     }     :@message_waiting     false     :@child_interpreter     nil     :@event_id     0     :@button_input_variable_id     0     :@main     true     :@move_route_waiting     false     :@map_id     0   :@menu_disabled ...

[mkxp-z] A graphics card that supports OpenGL 2.0 or later is required.

이미지
윈도우에서 빌드한 mkxp-z Executable 파일 실행 시, 이런 에러가 발생했다. 그래픽 카드 드라이버를 설치하면 해결될 수 있다. GTX 970를 사용중이었는데 드라이버를 설치해서 해결됐다.