Skip to content

Instantly share code, notes, and snippets.

@xxdoc
Forked from wqweto/cVbzlib.cls
Created June 14, 2017 05:16
Show Gist options
  • Select an option

  • Save xxdoc/75962b96969b023ff9a98e562cbea9c2 to your computer and use it in GitHub Desktop.

Select an option

Save xxdoc/75962b96969b023ff9a98e562cbea9c2 to your computer and use it in GitHub Desktop.
VB6 Deflate/Inflate with thunks
Option Explicit
'=========================================================================
' Thunk data
'=========================================================================
' Auto-generated on 29.3.2017 17:59:42, CodeSize=6048, DataSize=987, ALIGN_SIZE=16
Private Const STR_THUNK1 As String = _
"Vot0JAho/I8DAIsG/1AYi9CF0nUCXsOJVgSNSgK+AIAAAIPI/2aJQQJmiQFmiUH+g8EGTnXvV426BIADALn7AwAA86tmq1/HggCAAwAAAAAAx4L4jwMAAAAAALgBAAAAXsOQkJCQkJCQkJCQkJCQkItEJASLiACAAwCNDEmNFEhmi0xIAmaD+f90Dg+/yY0USWbHBFD//+sXZotSBGaD+v90DQ+/ymbHhEgEgAMA//+LiACAAwBXjRRJi0wkEGaJTFAEi5AAgAMAjRRSZsdEUAL//4uQAIADAGaLvEgEgAMAjRRSZok8UIuQAIADAGaLuACAAwCNFFIPvxRQZom8SASAAwCD+v9fdA+NDFJmi5AAgAMAZolUSAKLiACAAwCKVCQIiJQIAAADAIuIAIADAEGB4f9/AACJiACAAwDDkJCB7CgBAACLhCQsAQAAU1VWV4t4BIsAM/aLj/iPAwCJRCQ0hckPjv8AAACNh/KPAwCJRCQQi5wkRAEAAIvRK9YD" & _
"04P6Aw+MtgAAAIvejUQkKDPSK9iJXCQUjUQUKAPDO8F9C4tsJBAzwIoEKusWi6wkQAEAAIvaK9kD3jPAigQri1wkFIhEFChCg/oDfMuLTCQpi1wkKIHh/wAAAIvBweAFA8HB4AMrwYtMJCqB4f8AAACNFEmNFJKNFNLR4ivRi8uB4f8AAAADwovRweIIA9G59wcAAAPCmff5UotUJDhTV/9SKItMJByDxAxGQYlMJBCLj/iPAwA78Q+MNv///+spi4/4jwMAi8Y78X0dipQH8o8DAIvIK85AiJQ58o8DAIuP+I8DADvBfOOLn/iPAwCLhCREAQAAM8kr3jvBiZ/4jwMAiUwkIIlMJCSJTCQwD47KAwAAOYwkSAEAAA+EKgMAAIP4Aw+MIQMAAIusJEABAACJTCQQM8kz0opNAopVAIlUJCiNBEmNBICNBMDR4CvBM8mKTQGL8cHmBQPxweYDK/GLysHhCAPGA8oDwbn3BwAAmff5D7+EVwSAAwCD+P+J" & _
"RCQcD4TJAgAAjVQkPIlUJBTrBItEJByLlwCAAwArwgUAgAAAJf9/AIB5B0gNAID//0C5AIAAAIlUJBgryDPAhcB9FYtUJBiB4v9/AAAz24qcOgAAAwDrBTPbihwoi/Ar8Xkbi7cAgAMAK/ED8IHm/38AADPSipQ+AAADAOsFM9KKFC472nUPi3QkGEBGg/gDiXQkGHypg/gDdR6LVCQUiUr8iQKLRCQQg8IIQIlUJBSD+CCJRCQQfRyLRCQcjQRAD78ER4P4/4lEJBwPhUL///+LRCQQhcAPjvUBAACLjCREAQAAugMAAAA7yg+O8AAAAIuPAIADAAPKiUwkGOsLi6wkQAEAAItEJBCFwMdEJBwAAAAAD47HAAAAjWwkOI10JDiJRCQQhdJ9GYtMJBiB4f9/AAAzwIqEOQAAAwCJRCQU6xCLhCRAAQAAM8mKDAKJTCQUiwb32I0MEIXJfRyLjwCAAwADwQPCJf9/AAAzyYqMOAAAAwCLwesMi5wkQAEA" & _
"ADPAigQZOUQkFHUXiwaJRQCLTgSJTQSLTCQcQYPFCIlMJByLRCQQg8YISIlEJBAPhXH///+LRCQchcB0HYtMJBiJRCQQi4QkRAEAAEJBO9CJTCQYD4wl////i6wkQAEAAItcJCSL8oXbiXQkPA+OvQAAAI1DATvQfi+LTCQwi4QkPAEAAFFQ/1AMi1QkQIPECDPAiVQkIIpFAIl0JCSJRCQwuAEAAADrJ4tMJCCLhCQ8AQAAU1FQ/1AQg8QMjUP/hcDHRCQkAAAAAA+O/QAAAIvwg7wkRAEAAAMPjLIAAAAzyYpdAIpNAo0ESY0EgI0EwNHgK8EzyYpNAYvRweIFA9HB4gMr0YvLgeH/AAAAA8KL0cHiCAPRufcHAAADwpn3+VKLVCQ4U1f/UiiDxAzrf4tEJCiLVCQ4iUQkMIlUJCCJdCQkuAEAAADrhYusJEABAACLdCQkhfZ+HItMJCCLhCQ8AQAAVlFQ/1AQg8QMjUb/6Ur///+KVQCLhCQ8AQAA" & _
"UlD/UAyDxAi4AQAAAOk+////i4f4jwMAik0AiIw48o8DAIuH+I8DAECJh/iPAwCLjCREAQAARUlOiYwkRAEAAA+FDP///4msJEABAACLhCREAQAAM8k7wQ+PNvz//19eXVuBxCgBAADDkJCQkJCQkItEJAxWi3QkDItOEItWDNPgC9CJVgyLVCQUjQQRg/gIiUYQfEpXi3wkDItGBItOCDvBfA+DwECJRghQiwZQ/1cciQaLTgSLFopGDIgEEYtGBItOEItWDECDwfiJRgSLwcHqCIP4CIlWDIlOEH28X17DkJCQkJCQkJCQkJCQkJCQi0wkBFNWi3EIiwGLThiFyXQYi0wkEGoIgeH/AAAAUVZQ/1A4g8QQXlvDi0wkEID5j3cdi1BUgeH/AAAAM9tqCIpcCjBTVlD/UDiDxBBeW8OLUFSB4f8AAAAz22oJihwKjUwbAVFWUP9QOIPEEF5bw4tEJARWizCLQAiJRCQIi0QkEIXAD445AQAAU1VX6wSL" & _
"RCQcPQQBAAB+B78CAQAA6ww9AgEAAIv4fgONeP0rx4PL/4lEJBy9HQAAAI0EK4tOTJkrwtH4jRRAjQyRO3kEfQSL6OvmO3kIfgSL2OvdjQxAi0ZMjRyIZosEiGY9FwF/GQ+/0ItGVDPJageKjFAA/v//i1QkGFFS6xSLTlQz0g+/wGoIilQIqItEJBhSUFb/Vjhmi0MCg8QQZoXAdBaLawSLVCQUD7/IK/1RV1JW/1Y4g8QQi15Qg8//vR4AAACNBC+ZK8KLVCQY0fiNDEA7VIsEjQyLfQSL6OvkO1EIfgSL+OvbjRRAi05UD78Ek408k4tcJBQz0moFihTBUlNW/1Y4ZotHAoPEEGaFwHQWi0wkGItvBA+/wCvNUFFTVv9WOIPEEItEJByFwA+Pz/7//19dW17DkJCQkJCQkJCQkJBWV4t8JAxqFP9XGIvwVok+/1cki0cwg8QEiUYMi080ahyJThD/VxgzycdAFAEAAACJSBCJSAyJSBiJRgiLxl9e" & _
"wgQAkJCQkJCQkJCQkJCQkFaLdCQIV4tGCIs+UP9XIItOBFH/VyBW/1cgX17CBACQU1WLbCQMVlcz24t9CIt1AItHFIkfO8OJXwiJXwR0FmoQaHicAABXVv9WOIPEEIlfFDPA6wW4AQAAADlfGA+ElgAAADvDdAtqB1NXVv9WOIPEEItsJBw7635xgf3//wAAi918Bbv//wAAagNqAFdW/1Y4i0cQg8QQhcB0ErkIAAAAK8hRagBXVv9WOIPEEGoQU1dW/1Y4i9NqEIHy//8AAFJXVv9WOItEJDiLTCQ0agBTUFH/ViyLTCRIK+uDxDADy4XtiUwkGH+RM9tqA2oCV1b/VjiDxBDrPTvDdQxqA2oCV1b/VjiDxBCLVCQci0QkGGoBUlBV/1YsagdTV1b/VjhqCmoCV1b/VjhqA2oCV1b/VjiDxECLVCQgiw+JXxiJCotHBItMJCRfXl2JAbgBAAAAW8IUAJCQkJCQkJCQkJCB7AQFAABTi5wkFAUAAFVW" & _
"V7kPAAAAM8CNfCQY86uLvCQcBQAAM+0zyYlsJBCF234dM8CKBDmLdIQURjvoiXSEFH0Ci+hBO8t854lsJBAzyTPAi1QEGIlMBFgD0YPABNHig/g8i8p86jP2hdt+TI2MJJQAAAAz0scBAAAAAIoUPoXSi0SUVI1oAYlslFR+H4sZi+jR44PlAQvd0fhKiRl17otsJBCLnCQgBQAA6wSLbCQQRoPBBDvzfLuD/QmLxXwFuAkAAACLjCQYBQAAUGoAagCLEVONhCSkAAAAV1BS6BwAAACDxBxfXl1bgcQEBQAAw5CQkJCQkJCQkJCQkJCQUYtEJAhTVVZXagj/UBiLbCQsi1wkMIvwuAEAAACLzb8BAAAA0+CLy4tUJBjT50iJRCQQjQz9AAAAAFH/UhiJRgSNT/8z0jPAO8qJDnwfi04EQGbHRMH6//+LTgSIVMH4i04EiVTB/IsOO8F+4YtEJCQz/zvCD46PAAAAi1QkHIlUJCyLTCQgM8CKBA87xX5i" & _
"i1QkLIsCi1QkEIvII8qLVCQoO8p1TIsWi83T+CPCO8J/QItWBDPJM9tmiXzCAotUJCCKDBeLVgQrzYocwo0UwjvZfQKICotMJCC6AQAAAIoMDyvN0+KLDgPCO8F+xItcJDCLTCQsi0QkJEeDwQQ7+IlMJCwPjHn///+LBjP/hcB8aotGBDPJigz4jQT4O8t+VGbHQAL//4tWBDPAigT6jQz6K8OD+Ad+BbgHAAAAiBmL14vNUNPii0wkLI0EK1CLRCQsC9GLTCQoUotUJChQi0QkKFFSUOiV/v//i04Eg8QciUT5BIsGRzv4fpaLxl9eXVtZw5CQkJCQkJCQkJCQkItEJAhTVYtsJAyFwItdAFZ1B15dg8j/W8OLMIX2dQZeXTPAW8OLBlcz/4XAfB6LRgSLTPgEjUT4BIXJdAhQVf9TQIPECIsGRzv4fuKLTgRR/1MgVsdGBAAAAAD/UyCLVCQYX15dxwIAAAAAM8Bbw5CB7CABAABTi5wkKAEAAFZX" & _
"aLCBAAD/UxiL8LkkAAAAuAgICAiNfCQMiR5oIAEAAPOruRwAAAC4CQkJCY28JKAAAADzq7kGAAAAuAcHBweNvCQQAQAA86u4CAgICI1MJBCJhCQoAQAAUVaJhCQ0AQAA/1M8iUYEjVQkGLkIAAAAuAUFBQWNfCQYaiBSVvOr/1M8g8QYiUYIM8CJRhiJRhSJRhCJRgyJhpgBAACJhpwBAACJhqCBAACLxl9eW4HEIAEAAMIEAJCQkJCQkJCQkJCQVot0JAhXi04Miz6NRgyFyXQNO04EdAhQVv9XQIPECItOEI1GEIXJdA07Tgh0CFBW/1dAg8QIi04UjUYUhcl0CFBW/1dAg8QIjUYEUFb/V0CNTghRVv9XQIPEEFb/VyBfXsIEAJCQkJCQkJCQkJCQkItUJAxTi1wkDFWLbCQMVleLO4t1AIPI/4sKi1IEI86NFMozyYoKO89/JNPuK/lmOUICdRGLUgSF0nXdX15duP7///9bw4l1AIk7D79CAl9e"
Private Const STR_THUNK2 As String = _
"XVvDkJCQkJCQkJCQkJCQkFOKXCQMVot0JAyLhqCBAACLDoicMKABAACLlqCBAACLhqiBAABCgeL/fwAAiZaggQAAi5asgQAAO8J8HAUAAgAAiYasgQAAUIuGpIEAAFD/URyJhqSBAACLjqSBAACLlqiBAACIHBGLhqiBAABAiYaogQAAXlvDkJCQkJCQkJCQU1VWi3QkEFdoAAEAAIsuiWwkGP9VGImGpIEAAMeGrIEAAAABAADHhqiBAAAAAAAA6wSLbCQUi1wkHIXbfw6LhpwBAACFwA+O8AYAAIuGnAEAAI2+nAEAAIP4GH0qi1QkGIXbfhqLDzPAigLT4AmGmAEAAEKNQQhLg/gYiQd84olcJByJVCQYi0YYhcB1b4sXg/oQD4zHBgAAi46YAQAAg8LwisWJF4rhwekQiY6YAQAAi8iB4QAPAACB+QAIAAAPhcAFAACL0IHiAPAAAIH6AHAAAA+PrAUAAKggD4WkBQAAmbkfAAAA9/mF0g+FlAUA" & _
"AMdGGAEAAADpOf///4P4AXV1ixeD+gMPjAsGAACLhpgBAACDwv3R6IvIiReD4QPB6AKFyYmGmAEAAHUdi8rHRhgKAAAAg+EHK9HT6IkXiYaYAQAA6e3+//+D+QF1GItWBItGCIlWDIlGEMdGGAYAAADp0P7//4P5Ag+Fx/7//4lOGOm//v//g/gCdXGLD4P5Dg+MtQUAAIuGmAEAAIPB8ovQiQ+D4h+NTkSBwgEBAADHRiwAAAAAwegFiVYgi9CD4h/HRhgDAAAAQsHoBYlWJIvQg+IPwegEg8IEiYaYAQAAM8CJViiJAYlBBIlBCIlBDGaJQRCIQRLpSf7//4P4Aw+FhAAAAIM/Aw+MYQUAAItWLItGKDvQfUCDPwN8O4tNWItWLIqGmAEAADPbihwRJAeIRDNEi0Ysix+LlpgBAACLTihAg8P9iUYsweoDO8GJH4mWmAEAAHzAi0Ysi04oO8EPhd/9//+NTkRqE1FW/1U8g8QMiUYUx0YYBAAAAMdG" & _
"LAAAAADpvP3//4P4BA+F6AAAAItGIItWJItOLAPQO8p8PFCNRldQVv9VPItWIItOJIlGDFGNRBZXUFb/VTyNfhSJRhBXVv9VQIPEIMcHAAAAAMdGGAYAAADpaP3//4tOFI2WmAEAAFFXUv9VSIPEDIP4/w+ELwQAAIP4/g+ExAMAAIP4EH0Ti04siEQxV4tGLECJRizpLP3//3UHuQIAAADrD4vIg+kR99kbyYPhBIPBA4vQiU4wg+oS99ob0oPi+IPCC4P4EIlWNHUei0YshcB+FzPJikwwVsdGGAUAAACLwYlGPOnc/P//M8DHRhgFAAAAiUY86cv8//+D+AV1YIsfi04wO9kPjL8DAACLlpgBAAC4AQAAANPgi240K9mJH0gjwtPqA8WFwImWmAEAAH4ii1Yki14gi04sA9M7yn0TilY8iFQxV4t+LEdIhcCJfix/3sdGGAQAAADpYvz//4P4Bg+FmQAAAItGDI1eDFCNjpgBAABXUf9VSIPEDIP4" & _
"/w+EaQMAAIP4/g+EhQIAAD0AAQAAfQ1QVv9VRIPECOki/P//dUKLE4tGBDvQx0YYAQAAAHQOU1b/VUCDxAjHAwAAAACLRhCLTgiNfhA7wQ+E8fv//1dW/1VAg8QIxwcAAAAA6d77//89HgEAAA+N0/v//8dGGAcAAACJRhzpxPv//4P4B3VWi0Yci1VMLQEBAACLL40MQI0Uig+/SgI76Q+MggIAAIuGmAEAALsBAAAA0+OLSgRLI9gD2YleOA+/SgIr6YkvikoC0+jHRhgIAAAAiYaYAQAA6WX7//+D+Ah1PItWEI2GmAEAAFJXUP9VSIPEDIP4/w+ETwIAAIP4/g+E8QEAAIP4Hg+N6AEAAMdGGAkAAACJRhzpKPv//4P4CQ+FlAAAAItGHItUJBSNDECLQlCLF40ciA+/TIgCO9EPjCoCAACLhpgBAAC9AQAAANPli0sETSPoA+kPv0sCK9GJF4pLAtPox0YYBgAAAImGmAEAAItGOIXAjUj/iU44" & _
"D4S8+v//i3wkFIuWoIEAADPAK9WB4v9/AACKhDKgAQAAUFb/V0SLRjiDxAiFwI1I/4lOOHXU6Yf6//+D+Ap1NosPg/kQD4xdAQAAi4aYAQAAg8Hwi9CJD4Hi//8AAMdGGAsAAADB6BCJVkCJhpgBAADpUPr//4P4C3VGixeD+hAPjEYBAACLjpgBAACDwvCLwYkXwekQJf//AACJjpgBAACLTkA1//8AADvID4XGAAAA99kbyYPhC0GJThjpBfr//4P4DA+F/Pn//4M/CA+MHQEAAIuGmAEAACX/AAAAUFb/VUSLF4uOmAEAAItGQIPECIPC+MHpCEiJF4mOmAEAAIlGQA+Fvfn//8dGGAEAAADpsfn//4uGpIEAAFD/VSDHhqSBAAAAAAAAX4tMJByLVCQgXl3HAQAAAADHAgAAAAAzwFvCFACLjqSBAABR/1Ugx4akgQAAAAAAAF+LVCQci0QkIF5dxwIAAAAAxwAAAAAAM8BbwhQAi5akgQAAUv9V" & _
"IMeGpIEAAAAAAABfi0QkHItMJCBeXccAAAAAAMcBAAAAADPAW8IUAItMJCCLhqSBAABfiQGLRCQgi5aogQAAXokQXbgBAAAAW8IUAItUJCCLjqSBAABfiQqLTCQgi4aogQAAXokBXbgBAAAAW8IUAItEJCCLlqSBAABfiRCLjqiBAACLVCQgXl24AQAAAIkKW8IUAJCQkJCQkJCQkJCQkItEJARQ6Jbx///CEACQkJCLRCQEUOjW8f//whAAkJCQi0QkCI1IDI1QCFGLSARSixCLRCQMUVJQ6NPx///CEACLRCQEUOgG9v//whAAkJCQi0QkBFDoxvb//8IQAJCQkItEJAiNSAyNUAhRi0gEUosQi0QkDFFSUOjz9///whAAAIBAwCCgYOAQkFDQMLBw8AiISMgoqGjoGJhY2Di4ePgEhETEJKRk5BSUVNQ0tHT0DIxMzCysbOwcnFzcPLx8/AKCQsIiomLiEpJS0jKycvIKikrKKqpq6hqaWto6unr6" & _
"BoZGxiamZuYWllbWNrZ29g6OTs4urm7uHp5e3j6+fv4BgUHBIaFh4RGRUdExsXHxCYlJySmpaekZmVnZObl5+QWFRcUlpWXlFZVV1TW1dfUNjU3NLa1t7R2dXd09vX39A4NDwyOjY+MTk1PTM7Nz8wuLS8srq2vrG5tb2zu7e/sHh0fHJ6dn5xeXV9c3t3f3D49Pzy+vb+8fn1/fP79//wEBAAADAAAAAwAAAAIBAAAEAAAABAAAAAMBAAAFAAAABQAAAAQBAAAGAAAABgAAAAUBAAAHAAAABwAAAAYBAAAIAAAACAAAAAcBAAAJAAAACQAAAAgBAAAKAAAACgAAAAkBAQALAAAADAAAAAoBAQANAAAADgAAAAsBAQAPAAAAEAAAAAwBAQARAAAAEgAAAA0BAgATAAAAFgAAAA4BAgAXAAAAGgAAAA8BAgAbAAAAHgAAABABAgAfAAAAIgAAABEBAwAjAAAAKgAAABIBAwArAAAAMgAAABMBAwAzAAAA" & _
"OgAAABQBAwA7AAAAQgAAABUBBABDAAAAUgAAABYBBABTAAAAYgAAABcBBABjAAAAcgAAABgBBABzAAAAggAAABkBBQCDAAAAogAAABoBBQCjAAAAwgAAABsBBQDDAAAA4gAAABwBBQDjAAAAAQEAAB0BAAACAQAAAgEAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAEABQAAAAYAAAAFAAEABwAAAAgAAAAGAAIACQAAAAwAAAAHAAIADQAAABAAAAAIAAMAEQAAABgAAAAJAAMAGQAAACAAAAAKAAQAIQAAADAAAAALAAQAMQAAAEAAAAAMAAUAQQAAAGAAAAANAAUAYQAAAIAAAAAOAAYAgQAAAMAAAAAPAAYAwQAAAAABAAAQAAcAAQEAAIABAAARAAcAgQEAAAACAAASAAgAAQIAAAADAAATAAgAAQMAAAAEAAAUAAkAAQQAAAAGAAAVAAkA" & _
"AQYAAAAIAAAWAAoAAQgAAAAMAAAXAAoAAQwAAAAQAAAYAAsAARAAAAAYAAAZAAsAARgAAAAgAAAaAAwAASAAAAAwAAAbAAwAATAAAABAAAAcAA0AAUAAAABgAAAdAA0AAWAAAACAAAAQERIACAcJBgoFCwQMAw0CDgEP"
Private Const STR_THUNK_OFFSETS As String = "5920|5936|5952|5984|6000|6016|0|0|0|0|112|320|1776|1888|1648|2672|3328|3856|3760|6304|6656|6048|7016"
' end of generated code
'=========================================================================
' API
'=========================================================================
Private Const PAGE_EXECUTE_READWRITE As Long = &H40
Private Const MEM_COMMIT As Long = &H1000
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function VirtualAlloc Lib "kernel32.dll" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, Optional ByVal Msg As Long, Optional ByVal wParam As Long, Optional ByVal lParam As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)
'=========================================================================
' Constants and member variables
'=========================================================================
Private m_uRtbl As UcsRelocTableType
Private Type UcsRelocTableType
vbzlib_compress_init As Long
vbzlib_compress_cleanup As Long
vbzlib_compress_block As Long
vbzlib_decompress_init As Long
vbzlib_decompress_cleanup As Long
vbzlib_decompress_block As Long
vbzlib_malloc As Long
vbzlib_realloc As Long
vbzlib_free As Long
lz77_init As Long
lz77_advance As Long
lz77_compress As Long
zlib_literal As Long
zlib_match As Long
zlib_outbits As Long
zlib_mktable As Long
zlib_freetable As Long
zlib_emit_char As Long
zlib_huflookup As Long
zdat_lencodes As Long
zdat_distcodes As Long
zdat_mirrorbytes As Long
zdat_lenlenmap As Long
End Type
Private Type UcsIoBuffersType
block As Long
len As Long
outblock As Long
outlen As Long
End Type
Private Enum UcsRelocIndexesEnum
ucsIdx_vbzlib_compress_init = 0
ucsIdx_vbzlib_compress_cleanup
ucsIdx_vbzlib_compress_block
ucsIdx_vbzlib_decompress_init
ucsIdx_vbzlib_decompress_cleanup
ucsIdx_vbzlib_decompress_block
ucsIdx_vbzlib_malloc
ucsIdx_vbzlib_realloc
ucsIdx_vbzlib_free
ucsIdx_lz77_init
ucsIdx_lz77_advance
ucsIdx_lz77_compress
ucsIdx_zlib_literal
ucsIdx_zlib_match
ucsIdx_zlib_outbits
ucsIdx_zlib_mktable
ucsIdx_zlib_freetable
ucsIdx_zlib_emit_char
ucsIdx_zlib_huflookup
ucsIdx_zdat_lencodes
ucsIdx_zdat_distcodes
ucsIdx_zdat_mirrorbytes
ucsIdx_zdat_lenlenmap
End Enum
'=========================================================================
' Methods
'=========================================================================
Public Function Deflate(baInput() As Byte, baOutput() As Byte) As Boolean
Dim hZlib As Long
Dim uBuf As UcsIoBuffersType
Dim lResult As Long
On Error GoTo EH
If m_uRtbl.vbzlib_compress_init = 0 Then
pvInitRelocTable m_uRtbl
End If
hZlib = CallWindowProc(m_uRtbl.vbzlib_compress_init, VarPtr(m_uRtbl))
uBuf.block = VarPtr(baInput(0))
uBuf.len = UBound(baInput) + 1
lResult = CallWindowProc(m_uRtbl.vbzlib_compress_block, hZlib, VarPtr(uBuf))
If lResult = 1 Then
ReDim baOutput(0 To uBuf.outlen - 3) As Byte
Call CopyMemory(baOutput(0), ByVal uBuf.outblock + 2, uBuf.outlen - 2)
Call CoTaskMemFree(uBuf.outblock)
'--- success
Deflate = True
End If
EH:
If hZlib <> 0 Then
Call CallWindowProc(m_uRtbl.vbzlib_compress_cleanup, hZlib)
End If
End Function
Public Function Inflate(baInput() As Byte, baOutput() As Byte) As Boolean
Dim hZlib As Long
Dim uBuf As UcsIoBuffersType
Dim lResult As Long
Dim lHeader As Long
On Error GoTo EH
If m_uRtbl.vbzlib_decompress_init = 0 Then
pvInitRelocTable m_uRtbl
End If
hZlib = CallWindowProc(m_uRtbl.vbzlib_decompress_init, VarPtr(m_uRtbl))
lHeader = &H9C78
uBuf.block = VarPtr(lHeader)
uBuf.len = 2
lResult = CallWindowProc(m_uRtbl.vbzlib_decompress_block, hZlib, VarPtr(uBuf))
If lResult = 1 Then
uBuf.block = VarPtr(baInput(0))
uBuf.len = UBound(baInput) + 1
lResult = CallWindowProc(m_uRtbl.vbzlib_decompress_block, hZlib, VarPtr(uBuf))
If lResult = 1 Then
ReDim baOutput(0 To uBuf.outlen - 1) As Byte
Call CopyMemory(baOutput(0), ByVal uBuf.outblock, uBuf.outlen)
Call CoTaskMemFree(uBuf.outblock)
'--- success
Inflate = True
End If
End If
EH:
If hZlib <> 0 Then
Call CallWindowProc(m_uRtbl.vbzlib_decompress_cleanup, hZlib)
End If
End Function
Public Function InflatePtr(ByVal pInput As Long, ByVal lSize As Long, ByVal pOutput As Long, lOutSize As Long) As Boolean
Dim hZlib As Long
Dim uBuf As UcsIoBuffersType
Dim lResult As Long
Dim lHeader As Long
On Error GoTo EH
If m_uRtbl.vbzlib_decompress_init = 0 Then
pvInitRelocTable m_uRtbl
End If
hZlib = CallWindowProc(m_uRtbl.vbzlib_decompress_init, VarPtr(m_uRtbl))
lHeader = &H9C78
uBuf.block = VarPtr(lHeader)
uBuf.len = 2
lResult = CallWindowProc(m_uRtbl.vbzlib_decompress_block, hZlib, VarPtr(uBuf))
If lResult = 1 Then
uBuf.block = pInput
uBuf.len = lSize
lResult = CallWindowProc(m_uRtbl.vbzlib_decompress_block, hZlib, VarPtr(uBuf))
If lResult = 1 Then
lOutSize = uBuf.outlen
Call CopyMemory(ByVal pOutput, ByVal uBuf.outblock, lOutSize)
Call CoTaskMemFree(uBuf.outblock)
'--- success
InflatePtr = True
End If
End If
EH:
If hZlib <> 0 Then
Call CallWindowProc(m_uRtbl.vbzlib_decompress_cleanup, hZlib)
End If
End Function
'= private ===============================================================
Private Function pvInitRelocTable(rtbl As UcsRelocTableType) As Long
Dim lpThunk As Long
Dim vSplit As Variant
lpThunk = pvGetThunkAddress()
vSplit = Split(STR_THUNK_OFFSETS, "|")
With rtbl
.vbzlib_compress_init = lpThunk + vSplit(ucsIdx_vbzlib_compress_init)
.vbzlib_compress_cleanup = lpThunk + vSplit(ucsIdx_vbzlib_compress_cleanup)
.vbzlib_compress_block = lpThunk + vSplit(ucsIdx_vbzlib_compress_block)
.vbzlib_decompress_init = lpThunk + vSplit(ucsIdx_vbzlib_decompress_init)
.vbzlib_decompress_cleanup = lpThunk + vSplit(ucsIdx_vbzlib_decompress_cleanup)
.vbzlib_decompress_block = lpThunk + vSplit(ucsIdx_vbzlib_decompress_block)
.vbzlib_malloc = GetProcAddress(GetModuleHandle("ole32.dll"), "CoTaskMemAlloc")
.vbzlib_realloc = GetProcAddress(GetModuleHandle("ole32.dll"), "CoTaskMemRealloc")
.vbzlib_free = GetProcAddress(GetModuleHandle("ole32.dll"), "CoTaskMemFree")
.lz77_init = lpThunk + vSplit(ucsIdx_lz77_init)
.lz77_advance = lpThunk + vSplit(ucsIdx_lz77_advance)
.lz77_compress = lpThunk + vSplit(ucsIdx_lz77_compress)
.zlib_literal = lpThunk + vSplit(ucsIdx_zlib_literal)
.zlib_match = lpThunk + vSplit(ucsIdx_zlib_match)
.zlib_outbits = lpThunk + vSplit(ucsIdx_zlib_outbits)
.zlib_mktable = lpThunk + vSplit(ucsIdx_zlib_mktable)
.zlib_freetable = lpThunk + vSplit(ucsIdx_zlib_freetable)
.zlib_emit_char = lpThunk + vSplit(ucsIdx_zlib_emit_char)
.zlib_huflookup = lpThunk + vSplit(ucsIdx_zlib_huflookup)
.zdat_lencodes = lpThunk + vSplit(ucsIdx_zdat_lencodes)
.zdat_distcodes = lpThunk + vSplit(ucsIdx_zdat_distcodes)
.zdat_mirrorbytes = lpThunk + vSplit(ucsIdx_zdat_mirrorbytes)
.zdat_lenlenmap = lpThunk + vSplit(ucsIdx_zdat_lenlenmap)
End With
End Function
Private Function pvGetThunkAddress() As Long
Static lpThunk As Long
Dim baThunk() As Byte
If lpThunk = 0 Then
baThunk = FromBase64(STR_THUNK1 & STR_THUNK2)
lpThunk = VirtualAlloc(0, UBound(baThunk) + 1, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
Call CopyMemory(ByVal lpThunk, baThunk(0), UBound(baThunk) + 1)
End If
pvGetThunkAddress = lpThunk
End Function
Private Function FromBase64(sValue As String) As Byte()
With VBA.CreateObject("MSXML2.DOMDocument").createElement("dummy")
.DataType = "bin.base64"
.Text = sValue
FromBase64 = .NodeTypedValue
End With
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment