-
-
Save xxdoc/75962b96969b023ff9a98e562cbea9c2 to your computer and use it in GitHub Desktop.
VB6 Deflate/Inflate with thunks
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
| 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