1
This commit is contained in:
commit
2fe8ce9150
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
363
.gitignore
vendored
Normal file
363
.gitignore
vendored
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Oo]ut/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
65
PdbChecker.sln
Normal file
65
PdbChecker.sln
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio Version 17
|
||||||
|
VisualStudioVersion = 17.0.32126.317
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PdbChecker", "PdbChecker\PdbChecker.vcxproj", "{BB78E585-C6E4-4DA5-A622-E4182879747B}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdbServer", "PdbServer\PdbServer.csproj", "{1AC34856-024B-431F-BC1B-CA4A4F0992D9}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UpLoader", "UpLoader\UpLoader.vcxproj", "{B9E9EF11-138C-467C-8118-F87ED46F35A5}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|Any CPU.ActiveCfg = Debug|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|Any CPU.Build.0 = Debug|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|Any CPU.ActiveCfg = Release|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|Any CPU.Build.0 = Release|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|x64.Build.0 = Release|x64
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{BB78E585-C6E4-4DA5-A622-E4182879747B}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{1AC34856-024B-431F-BC1B-CA4A4F0992D9}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|Any CPU.ActiveCfg = Debug|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|Any CPU.Build.0 = Debug|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|Any CPU.ActiveCfg = Release|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|Any CPU.Build.0 = Release|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|x64.Build.0 = Release|x64
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{B9E9EF11-138C-467C-8118-F87ED46F35A5}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {B2CACF75-DA70-49F9-95A8-7257E2C4A135}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
855
PdbChecker/Http.hpp
Normal file
855
PdbChecker/Http.hpp
Normal file
@ -0,0 +1,855 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef HTTPREQUEST_HPP
|
||||||
|
#define HTTPREQUEST_HPP
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <system_error>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
# pragma push_macro("WIN32_LEAN_AND_MEAN")
|
||||||
|
# pragma push_macro("NOMINMAX")
|
||||||
|
# ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# endif // WIN32_LEAN_AND_MEAN
|
||||||
|
# ifndef NOMINMAX
|
||||||
|
# define NOMINMAX
|
||||||
|
# endif // NOMINMAX
|
||||||
|
# include <winsock2.h>
|
||||||
|
# if _WIN32_WINNT < _WIN32_WINNT_WINXP
|
||||||
|
extern "C" char* _strdup(const char* strSource);
|
||||||
|
# define strdup _strdup
|
||||||
|
# include <wspiapi.h>
|
||||||
|
# endif // _WIN32_WINNT < _WIN32_WINNT_WINXP
|
||||||
|
# include <ws2tcpip.h>
|
||||||
|
# pragma pop_macro("WIN32_LEAN_AND_MEAN")
|
||||||
|
# pragma pop_macro("NOMINMAX")
|
||||||
|
#else
|
||||||
|
# include <errno.h>
|
||||||
|
# include <fcntl.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# include <netdb.h>
|
||||||
|
# include <sys/select.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
|
||||||
|
namespace http
|
||||||
|
{
|
||||||
|
class RequestError final : public std::logic_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit RequestError(const char* str) : std::logic_error{ str } {}
|
||||||
|
explicit RequestError(const std::string& str) : std::logic_error{ str } {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ResponseError final : public std::runtime_error
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ResponseError(const char* str) : std::runtime_error{ str } {}
|
||||||
|
explicit ResponseError(const std::string& str) : std::runtime_error{ str } {}
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class InternetProtocol : std::uint8_t
|
||||||
|
{
|
||||||
|
V4,
|
||||||
|
V6
|
||||||
|
};
|
||||||
|
|
||||||
|
inline namespace detail
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
class WinSock final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WinSock()
|
||||||
|
{
|
||||||
|
WSADATA wsaData;
|
||||||
|
const auto error = WSAStartup(MAKEWORD(2, 2), &wsaData);
|
||||||
|
if (error != 0)
|
||||||
|
throw std::system_error{ error, std::system_category(), "WSAStartup failed" };
|
||||||
|
|
||||||
|
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
|
||||||
|
{
|
||||||
|
WSACleanup();
|
||||||
|
throw std::runtime_error{ "Invalid WinSock version" };
|
||||||
|
}
|
||||||
|
|
||||||
|
started = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
~WinSock()
|
||||||
|
{
|
||||||
|
if (started) WSACleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
WinSock(WinSock&& other) noexcept :
|
||||||
|
started{ other.started }
|
||||||
|
{
|
||||||
|
other.started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
WinSock& operator=(WinSock&& other) noexcept
|
||||||
|
{
|
||||||
|
if (&other == this) return *this;
|
||||||
|
if (started) WSACleanup();
|
||||||
|
started = other.started;
|
||||||
|
other.started = false;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool started = false;
|
||||||
|
};
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
|
||||||
|
inline int getLastError() noexcept
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
return WSAGetLastError();
|
||||||
|
#else
|
||||||
|
return errno;
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr int getAddressFamily(const InternetProtocol internetProtocol)
|
||||||
|
{
|
||||||
|
return (internetProtocol == InternetProtocol::V4) ? AF_INET :
|
||||||
|
(internetProtocol == InternetProtocol::V6) ? AF_INET6 :
|
||||||
|
throw RequestError{ "Unsupported protocol" };
|
||||||
|
}
|
||||||
|
|
||||||
|
class Socket final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
using Type = SOCKET;
|
||||||
|
static constexpr Type invalid = INVALID_SOCKET;
|
||||||
|
#else
|
||||||
|
using Type = int;
|
||||||
|
static constexpr Type invalid = -1;
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
|
||||||
|
explicit Socket(const InternetProtocol internetProtocol) :
|
||||||
|
endpoint{ socket(getAddressFamily(internetProtocol), SOCK_STREAM, IPPROTO_TCP) }
|
||||||
|
{
|
||||||
|
if (endpoint == invalid)
|
||||||
|
throw std::system_error{ getLastError(), std::system_category(), "Failed to create socket" };
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
ULONG mode = 1;
|
||||||
|
if (ioctlsocket(endpoint, FIONBIO, &mode) != 0)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to get socket flags" };
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
const auto flags = fcntl(endpoint, F_GETFL);
|
||||||
|
if (flags == -1)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to get socket flags" };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fcntl(endpoint, F_SETFL, flags | O_NONBLOCK) == -1)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to set socket flags" };
|
||||||
|
}
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
const int value = 1;
|
||||||
|
if (setsockopt(endpoint, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value)) == -1)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to set socket option" };
|
||||||
|
}
|
||||||
|
#endif // __APPLE__
|
||||||
|
}
|
||||||
|
|
||||||
|
~Socket()
|
||||||
|
{
|
||||||
|
if (endpoint != invalid) close();
|
||||||
|
}
|
||||||
|
|
||||||
|
Socket(Socket&& other) noexcept :
|
||||||
|
endpoint{ other.endpoint }
|
||||||
|
{
|
||||||
|
other.endpoint = invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
Socket& operator=(Socket&& other) noexcept
|
||||||
|
{
|
||||||
|
if (&other == this) return *this;
|
||||||
|
if (endpoint != invalid) close();
|
||||||
|
endpoint = other.endpoint;
|
||||||
|
other.endpoint = invalid;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void connect(const struct sockaddr* address, const socklen_t addressSize, const std::int64_t timeout)
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
auto result = ::connect(endpoint, address, addressSize);
|
||||||
|
while (result == -1 && WSAGetLastError() == WSAEINTR)
|
||||||
|
result = ::connect(endpoint, address, addressSize);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
{
|
||||||
|
if (WSAGetLastError() == WSAEWOULDBLOCK)
|
||||||
|
{
|
||||||
|
select(SelectType::write, timeout);
|
||||||
|
|
||||||
|
char socketErrorPointer[sizeof(int)];
|
||||||
|
socklen_t optionLength = sizeof(socketErrorPointer);
|
||||||
|
if (getsockopt(endpoint, SOL_SOCKET, SO_ERROR, socketErrorPointer, &optionLength) == -1)
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to get socket option" };
|
||||||
|
|
||||||
|
int socketError;
|
||||||
|
std::memcpy(&socketError, socketErrorPointer, sizeof(socketErrorPointer));
|
||||||
|
|
||||||
|
if (socketError != 0)
|
||||||
|
throw std::system_error{ socketError, std::system_category(), "Failed to connect" };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to connect" };
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
auto result = ::connect(endpoint, address, addressSize);
|
||||||
|
while (result == -1 && errno == EINTR)
|
||||||
|
result = ::connect(endpoint, address, addressSize);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
{
|
||||||
|
if (errno == EINPROGRESS)
|
||||||
|
{
|
||||||
|
select(SelectType::write, timeout);
|
||||||
|
|
||||||
|
int socketError;
|
||||||
|
socklen_t optionLength = sizeof(socketError);
|
||||||
|
if (getsockopt(endpoint, SOL_SOCKET, SO_ERROR, &socketError, &optionLength) == -1)
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to get socket option" };
|
||||||
|
|
||||||
|
if (socketError != 0)
|
||||||
|
throw std::system_error{ socketError, std::system_category(), "Failed to connect" };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to connect" };
|
||||||
|
}
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t send(const void* buffer, const std::size_t length, const std::int64_t timeout)
|
||||||
|
{
|
||||||
|
select(SelectType::write, timeout);
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
auto result = ::send(endpoint, reinterpret_cast<const char*>(buffer),
|
||||||
|
static_cast<int>(length), 0);
|
||||||
|
|
||||||
|
while (result == -1 && WSAGetLastError() == WSAEINTR)
|
||||||
|
result = ::send(endpoint, reinterpret_cast<const char*>(buffer),
|
||||||
|
static_cast<int>(length), 0);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to send data" };
|
||||||
|
#else
|
||||||
|
auto result = ::send(endpoint, reinterpret_cast<const char*>(buffer),
|
||||||
|
length, noSignal);
|
||||||
|
|
||||||
|
while (result == -1 && errno == EINTR)
|
||||||
|
result = ::send(endpoint, reinterpret_cast<const char*>(buffer),
|
||||||
|
length, noSignal);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to send data" };
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
return static_cast<std::size_t>(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t recv(void* buffer, const std::size_t length, const std::int64_t timeout)
|
||||||
|
{
|
||||||
|
select(SelectType::read, timeout);
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
auto result = ::recv(endpoint, reinterpret_cast<char*>(buffer),
|
||||||
|
static_cast<int>(length), 0);
|
||||||
|
|
||||||
|
while (result == -1 && WSAGetLastError() == WSAEINTR)
|
||||||
|
result = ::recv(endpoint, reinterpret_cast<char*>(buffer),
|
||||||
|
static_cast<int>(length), 0);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to read data" };
|
||||||
|
#else
|
||||||
|
auto result = ::recv(endpoint, reinterpret_cast<char*>(buffer),
|
||||||
|
length, noSignal);
|
||||||
|
|
||||||
|
while (result == -1 && errno == EINTR)
|
||||||
|
result = ::recv(endpoint, reinterpret_cast<char*>(buffer),
|
||||||
|
length, noSignal);
|
||||||
|
|
||||||
|
if (result == -1)
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to read data" };
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
return static_cast<std::size_t>(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum class SelectType
|
||||||
|
{
|
||||||
|
read,
|
||||||
|
write
|
||||||
|
};
|
||||||
|
|
||||||
|
void select(const SelectType type, const std::int64_t timeout)
|
||||||
|
{
|
||||||
|
fd_set descriptorSet;
|
||||||
|
FD_ZERO(&descriptorSet);
|
||||||
|
FD_SET(endpoint, &descriptorSet);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
TIMEVAL selectTimeout{
|
||||||
|
static_cast<LONG>(timeout / 1000),
|
||||||
|
static_cast<LONG>((timeout % 1000) * 1000)
|
||||||
|
};
|
||||||
|
auto count = ::select(0,
|
||||||
|
(type == SelectType::read) ? &descriptorSet : nullptr,
|
||||||
|
(type == SelectType::write) ? &descriptorSet : nullptr,
|
||||||
|
nullptr,
|
||||||
|
(timeout >= 0) ? &selectTimeout : nullptr);
|
||||||
|
|
||||||
|
while (count == -1 && WSAGetLastError() == WSAEINTR)
|
||||||
|
count = ::select(0,
|
||||||
|
(type == SelectType::read) ? &descriptorSet : nullptr,
|
||||||
|
(type == SelectType::write) ? &descriptorSet : nullptr,
|
||||||
|
nullptr,
|
||||||
|
(timeout >= 0) ? &selectTimeout : nullptr);
|
||||||
|
|
||||||
|
if (count == -1)
|
||||||
|
throw std::system_error{ WSAGetLastError(), std::system_category(), "Failed to select socket" };
|
||||||
|
else if (count == 0)
|
||||||
|
throw ResponseError{ "Request timed out" };
|
||||||
|
#else
|
||||||
|
timeval selectTimeout{
|
||||||
|
static_cast<time_t>(timeout / 1000),
|
||||||
|
static_cast<suseconds_t>((timeout % 1000) * 1000)
|
||||||
|
};
|
||||||
|
auto count = ::select(endpoint + 1,
|
||||||
|
(type == SelectType::read) ? &descriptorSet : nullptr,
|
||||||
|
(type == SelectType::write) ? &descriptorSet : nullptr,
|
||||||
|
nullptr,
|
||||||
|
(timeout >= 0) ? &selectTimeout : nullptr);
|
||||||
|
|
||||||
|
while (count == -1 && errno == EINTR)
|
||||||
|
count = ::select(endpoint + 1,
|
||||||
|
(type == SelectType::read) ? &descriptorSet : nullptr,
|
||||||
|
(type == SelectType::write) ? &descriptorSet : nullptr,
|
||||||
|
nullptr,
|
||||||
|
(timeout >= 0) ? &selectTimeout : nullptr);
|
||||||
|
|
||||||
|
if (count == -1)
|
||||||
|
throw std::system_error{ errno, std::system_category(), "Failed to select socket" };
|
||||||
|
else if (count == 0)
|
||||||
|
throw ResponseError{ "Request timed out" };
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
}
|
||||||
|
|
||||||
|
void close() noexcept
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
closesocket(endpoint);
|
||||||
|
#else
|
||||||
|
::close(endpoint);
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__unix__) && !defined(__APPLE__) && !defined(__CYGWIN__)
|
||||||
|
static constexpr int noSignal = MSG_NOSIGNAL;
|
||||||
|
#else
|
||||||
|
static constexpr int noSignal = 0;
|
||||||
|
#endif // defined(__unix__) && !defined(__APPLE__)
|
||||||
|
|
||||||
|
Type endpoint = invalid;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool isWhitespaceChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
// RFC 7230, 3.2.3. Whitespace
|
||||||
|
return c == ' ' || c == '\t';
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool isDigitChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
// RFC 5234, Appendix B.1. Core Rules
|
||||||
|
return c >= '0' && c <= '9';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isAlphaChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
// RFC 5234, Appendix B.1. Core Rules
|
||||||
|
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isTokenChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
// RFC 7230, 3.2.6. Field Value Components
|
||||||
|
return c == '!' || c == '#' || c == '$' || c == '%' || c == '&' || c == '\'' || c == '*' ||
|
||||||
|
c == '+' || c == '-' || c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~' ||
|
||||||
|
isDigitChar(c) ||
|
||||||
|
isAlphaChar(c);
|
||||||
|
};
|
||||||
|
|
||||||
|
// RFC 5234, B.1. Core Rules
|
||||||
|
inline bool isVisibleChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
return c >= 0x21 && c <= 0x7E;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RFC 7230, Appendix B. Collected ABNF
|
||||||
|
inline bool isObsTextChar(const char c) noexcept
|
||||||
|
{
|
||||||
|
return static_cast<unsigned char>(c) >= 0x80 &&
|
||||||
|
static_cast<unsigned char>(c) <= 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator>
|
||||||
|
Iterator skipWhitespaces(const Iterator begin, const Iterator end)
|
||||||
|
{
|
||||||
|
auto i = begin;
|
||||||
|
for (i = begin; i != end; ++i)
|
||||||
|
if (!isWhitespaceChar(*i))
|
||||||
|
break;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RFC 7230, 3.2.6. Field Value Components
|
||||||
|
template <class Iterator>
|
||||||
|
std::pair<Iterator, std::string> parseToken(const Iterator begin, const Iterator end)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
auto i = begin;
|
||||||
|
for (; i != end && isTokenChar(*i); ++i)
|
||||||
|
result.push_back(*i);
|
||||||
|
|
||||||
|
if (result.empty())
|
||||||
|
throw ResponseError{ "Invalid token" };
|
||||||
|
|
||||||
|
return std::make_pair(i, std::move(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Iterator>
|
||||||
|
std::pair<Iterator, std::string> parseFieldValue(const Iterator begin, const Iterator end)
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
auto i = begin;
|
||||||
|
for (; i != end && (isVisibleChar(*i) || isWhitespaceChar(*i) || isObsTextChar(*i)); ++i)
|
||||||
|
result.push_back(*i);
|
||||||
|
|
||||||
|
return std::make_pair(i, std::move(result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Response final
|
||||||
|
{
|
||||||
|
// RFC 7231, 6. Response Status Codes
|
||||||
|
enum Status
|
||||||
|
{
|
||||||
|
Continue = 100,
|
||||||
|
SwitchingProtocol = 101,
|
||||||
|
Processing = 102,
|
||||||
|
EarlyHints = 103,
|
||||||
|
|
||||||
|
Ok = 200,
|
||||||
|
Created = 201,
|
||||||
|
Accepted = 202,
|
||||||
|
NonAuthoritativeInformation = 203,
|
||||||
|
NoContent = 204,
|
||||||
|
ResetContent = 205,
|
||||||
|
PartialContent = 206,
|
||||||
|
MultiStatus = 207,
|
||||||
|
AlreadyReported = 208,
|
||||||
|
ImUsed = 226,
|
||||||
|
|
||||||
|
MultipleChoice = 300,
|
||||||
|
MovedPermanently = 301,
|
||||||
|
Found = 302,
|
||||||
|
SeeOther = 303,
|
||||||
|
NotModified = 304,
|
||||||
|
UseProxy = 305,
|
||||||
|
TemporaryRedirect = 307,
|
||||||
|
PermanentRedirect = 308,
|
||||||
|
|
||||||
|
BadRequest = 400,
|
||||||
|
Unauthorized = 401,
|
||||||
|
PaymentRequired = 402,
|
||||||
|
Forbidden = 403,
|
||||||
|
NotFound = 404,
|
||||||
|
MethodNotAllowed = 405,
|
||||||
|
NotAcceptable = 406,
|
||||||
|
ProxyAuthenticationRequired = 407,
|
||||||
|
RequestTimeout = 408,
|
||||||
|
Conflict = 409,
|
||||||
|
Gone = 410,
|
||||||
|
LengthRequired = 411,
|
||||||
|
PreconditionFailed = 412,
|
||||||
|
PayloadTooLarge = 413,
|
||||||
|
UriTooLong = 414,
|
||||||
|
UnsupportedMediaType = 415,
|
||||||
|
RangeNotSatisfiable = 416,
|
||||||
|
ExpectationFailed = 417,
|
||||||
|
MisdirectedRequest = 421,
|
||||||
|
UnprocessableEntity = 422,
|
||||||
|
Locked = 423,
|
||||||
|
FailedDependency = 424,
|
||||||
|
TooEarly = 425,
|
||||||
|
UpgradeRequired = 426,
|
||||||
|
PreconditionRequired = 428,
|
||||||
|
TooManyRequests = 429,
|
||||||
|
RequestHeaderFieldsTooLarge = 431,
|
||||||
|
UnavailableForLegalReasons = 451,
|
||||||
|
|
||||||
|
InternalServerError = 500,
|
||||||
|
NotImplemented = 501,
|
||||||
|
BadGateway = 502,
|
||||||
|
ServiceUnavailable = 503,
|
||||||
|
GatewayTimeout = 504,
|
||||||
|
HttpVersionNotSupported = 505,
|
||||||
|
VariantAlsoNegotiates = 506,
|
||||||
|
InsufficientStorage = 507,
|
||||||
|
LoopDetected = 508,
|
||||||
|
NotExtended = 510,
|
||||||
|
NetworkAuthenticationRequired = 511
|
||||||
|
};
|
||||||
|
|
||||||
|
int status = 0;
|
||||||
|
std::string description;
|
||||||
|
std::vector<std::string> headers;
|
||||||
|
std::vector<std::uint8_t> body;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Request final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit Request(const std::string& url,
|
||||||
|
const InternetProtocol protocol = InternetProtocol::V4) :
|
||||||
|
internetProtocol{ protocol }
|
||||||
|
{
|
||||||
|
const auto schemeEndPosition = url.find("://");
|
||||||
|
|
||||||
|
if (schemeEndPosition != std::string::npos)
|
||||||
|
{
|
||||||
|
scheme = url.substr(0, schemeEndPosition);
|
||||||
|
path = url.substr(schemeEndPosition + 3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scheme = "http";
|
||||||
|
path = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto fragmentPosition = path.find('#');
|
||||||
|
|
||||||
|
// remove the fragment part
|
||||||
|
if (fragmentPosition != std::string::npos)
|
||||||
|
path.resize(fragmentPosition);
|
||||||
|
|
||||||
|
const auto pathPosition = path.find('/');
|
||||||
|
|
||||||
|
if (pathPosition == std::string::npos)
|
||||||
|
{
|
||||||
|
host = path;
|
||||||
|
path = "/";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
host = path.substr(0, pathPosition);
|
||||||
|
path = path.substr(pathPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto portPosition = host.find(':');
|
||||||
|
|
||||||
|
if (portPosition != std::string::npos)
|
||||||
|
{
|
||||||
|
domain = host.substr(0, portPosition);
|
||||||
|
port = host.substr(portPosition + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
domain = host;
|
||||||
|
port = "80";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Response send(const std::string& method = "GET",
|
||||||
|
const std::string& body = "",
|
||||||
|
const std::vector<std::string>& headers = {},
|
||||||
|
const std::chrono::milliseconds timeout = std::chrono::milliseconds{ -1 })
|
||||||
|
{
|
||||||
|
return send(method,
|
||||||
|
std::vector<uint8_t>(body.begin(), body.end()),
|
||||||
|
headers,
|
||||||
|
timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Response send(const std::string& method,
|
||||||
|
const std::vector<uint8_t>& body,
|
||||||
|
const std::vector<std::string>& headers,
|
||||||
|
const std::chrono::milliseconds timeout = std::chrono::milliseconds{ -1 })
|
||||||
|
{
|
||||||
|
const auto stopTime = std::chrono::steady_clock::now() + timeout;
|
||||||
|
|
||||||
|
if (scheme != "http")
|
||||||
|
throw RequestError{ "Only HTTP scheme is supported" };
|
||||||
|
|
||||||
|
addrinfo hints = {};
|
||||||
|
hints.ai_family = getAddressFamily(internetProtocol);
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
|
addrinfo* info;
|
||||||
|
if (getaddrinfo(domain.c_str(), port.c_str(), &hints, &info) != 0)
|
||||||
|
throw std::system_error{ getLastError(), std::system_category(), "Failed to get address info of " + domain };
|
||||||
|
|
||||||
|
const std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> addressInfo{ info, freeaddrinfo };
|
||||||
|
|
||||||
|
// RFC 7230, 3.1.1. Request Line
|
||||||
|
std::string headerData = method + " " + path + " HTTP/1.1\r\n";
|
||||||
|
|
||||||
|
for (const auto& header : headers)
|
||||||
|
headerData += header + "\r\n";
|
||||||
|
|
||||||
|
// RFC 7230, 3.2. Header Fields
|
||||||
|
headerData += "Host: " + host + "\r\n"
|
||||||
|
"Content-Length: " + std::to_string(body.size()) + "\r\n"
|
||||||
|
"\r\n";
|
||||||
|
|
||||||
|
std::vector<uint8_t> requestData(headerData.begin(), headerData.end());
|
||||||
|
requestData.insert(requestData.end(), body.begin(), body.end());
|
||||||
|
|
||||||
|
Socket socket{ internetProtocol };
|
||||||
|
|
||||||
|
const auto getRemainingMilliseconds = [](const std::chrono::steady_clock::time_point time) noexcept -> std::int64_t {
|
||||||
|
const auto now = std::chrono::steady_clock::now();
|
||||||
|
const auto remainingTime = std::chrono::duration_cast<std::chrono::milliseconds>(time - now);
|
||||||
|
return (remainingTime.count() > 0) ? remainingTime.count() : 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// take the first address from the list
|
||||||
|
socket.connect(addressInfo->ai_addr, static_cast<socklen_t>(addressInfo->ai_addrlen),
|
||||||
|
(timeout.count() >= 0) ? getRemainingMilliseconds(stopTime) : -1);
|
||||||
|
|
||||||
|
auto remaining = requestData.size();
|
||||||
|
auto sendData = requestData.data();
|
||||||
|
|
||||||
|
// send the request
|
||||||
|
while (remaining > 0)
|
||||||
|
{
|
||||||
|
const auto size = socket.send(sendData, remaining,
|
||||||
|
(timeout.count() >= 0) ? getRemainingMilliseconds(stopTime) : -1);
|
||||||
|
remaining -= size;
|
||||||
|
sendData += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::array<std::uint8_t, 4096> tempBuffer;
|
||||||
|
constexpr std::array<std::uint8_t, 2> crlf = { '\r', '\n' };
|
||||||
|
Response response;
|
||||||
|
std::vector<std::uint8_t> responseData;
|
||||||
|
enum class State
|
||||||
|
{
|
||||||
|
parsingStatusLine,
|
||||||
|
parsingHeaders,
|
||||||
|
parsingBody
|
||||||
|
} state = State::parsingStatusLine;
|
||||||
|
bool contentLengthReceived = false;
|
||||||
|
std::size_t contentLength = 0;
|
||||||
|
bool chunkedResponse = false;
|
||||||
|
std::size_t expectedChunkSize = 0;
|
||||||
|
bool removeCrlfAfterChunk = false;
|
||||||
|
|
||||||
|
// read the response
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
const auto size = socket.recv(tempBuffer.data(), tempBuffer.size(),
|
||||||
|
(timeout.count() >= 0) ? getRemainingMilliseconds(stopTime) : -1);
|
||||||
|
if (size == 0) // disconnected
|
||||||
|
return response;
|
||||||
|
|
||||||
|
responseData.insert(responseData.end(), tempBuffer.begin(), tempBuffer.begin() + size);
|
||||||
|
|
||||||
|
if (state != State::parsingBody)
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
// RFC 7230, 3. Message Format
|
||||||
|
const auto i = std::search(responseData.begin(), responseData.end(), crlf.begin(), crlf.end());
|
||||||
|
|
||||||
|
// didn't find a newline
|
||||||
|
if (i == responseData.end()) break;
|
||||||
|
|
||||||
|
const std::string line(responseData.begin(), i);
|
||||||
|
responseData.erase(responseData.begin(), i + 2);
|
||||||
|
|
||||||
|
// empty line indicates the end of the header section (RFC 7230, 2.1. Client/Server Messaging)
|
||||||
|
if (line.empty())
|
||||||
|
{
|
||||||
|
state = State::parsingBody;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (state == State::parsingStatusLine) // RFC 7230, 3.1.2. Status Line
|
||||||
|
{
|
||||||
|
state = State::parsingHeaders;
|
||||||
|
|
||||||
|
const auto httpEndIterator = std::find(line.begin(), line.end(), ' ');
|
||||||
|
|
||||||
|
if (httpEndIterator != line.end())
|
||||||
|
{
|
||||||
|
const auto statusStartIterator = httpEndIterator + 1;
|
||||||
|
const auto statusEndIterator = std::find(statusStartIterator, line.end(), ' ');
|
||||||
|
const std::string status{ statusStartIterator, statusEndIterator };
|
||||||
|
response.status = std::stoi(status);
|
||||||
|
|
||||||
|
if (statusEndIterator != line.end())
|
||||||
|
{
|
||||||
|
const auto descriptionStartIterator = statusEndIterator + 1;
|
||||||
|
response.description = std::string{ descriptionStartIterator, line.end() };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (state == State::parsingHeaders) // RFC 7230, 3.2. Header Fields
|
||||||
|
{
|
||||||
|
response.headers.push_back(line);
|
||||||
|
|
||||||
|
auto headerIterator = line.cbegin();
|
||||||
|
const auto tokenResult = parseToken(headerIterator, line.cend());
|
||||||
|
headerIterator = tokenResult.first;
|
||||||
|
auto headerName = std::move(tokenResult.second);
|
||||||
|
|
||||||
|
const auto toLower = [](const char c) noexcept {
|
||||||
|
return (c >= 'A' && c <= 'Z') ? c - ('A' - 'a') : c;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::transform(headerName.begin(), headerName.end(), headerName.begin(), toLower);
|
||||||
|
|
||||||
|
if (headerIterator == line.cend())
|
||||||
|
throw ResponseError{ "Invalid header" };
|
||||||
|
|
||||||
|
if (*headerIterator++ != ':')
|
||||||
|
throw ResponseError{ "Invalid header" };
|
||||||
|
|
||||||
|
headerIterator = skipWhitespaces(headerIterator, line.cend());
|
||||||
|
|
||||||
|
const auto valueResult = parseFieldValue(headerIterator, line.cend());
|
||||||
|
|
||||||
|
headerIterator = valueResult.first;
|
||||||
|
auto headerValue = std::move(valueResult.second);
|
||||||
|
|
||||||
|
headerIterator = skipWhitespaces(headerIterator, line.cend());
|
||||||
|
|
||||||
|
if (headerIterator != line.cend())
|
||||||
|
throw ResponseError{ "Invalid header" };
|
||||||
|
|
||||||
|
if (headerName == "content-length")
|
||||||
|
{
|
||||||
|
contentLength = std::stoul(headerValue);
|
||||||
|
contentLengthReceived = true;
|
||||||
|
response.body.reserve(contentLength);
|
||||||
|
}
|
||||||
|
else if (headerName == "transfer-encoding")
|
||||||
|
{
|
||||||
|
if (headerValue == "chunked")
|
||||||
|
chunkedResponse = true;
|
||||||
|
else
|
||||||
|
throw ResponseError{ "Unsupported transfer encoding: " + headerValue };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state == State::parsingBody)
|
||||||
|
{
|
||||||
|
// Content-Length must be ignored if Transfer-Encoding is received (RFC 7230, 3.2. Content-Length)
|
||||||
|
if (chunkedResponse)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (expectedChunkSize > 0)
|
||||||
|
{
|
||||||
|
const auto toWrite = (std::min)(expectedChunkSize, responseData.size());
|
||||||
|
response.body.insert(response.body.end(), responseData.begin(),
|
||||||
|
responseData.begin() + static_cast<std::ptrdiff_t>(toWrite));
|
||||||
|
responseData.erase(responseData.begin(),
|
||||||
|
responseData.begin() + static_cast<std::ptrdiff_t>(toWrite));
|
||||||
|
expectedChunkSize -= toWrite;
|
||||||
|
|
||||||
|
if (expectedChunkSize == 0) removeCrlfAfterChunk = true;
|
||||||
|
if (responseData.empty()) break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (removeCrlfAfterChunk)
|
||||||
|
{
|
||||||
|
if (responseData.size() < 2) break;
|
||||||
|
|
||||||
|
if (!std::equal(crlf.begin(), crlf.end(), responseData.begin()))
|
||||||
|
throw ResponseError{ "Invalid chunk" };
|
||||||
|
|
||||||
|
removeCrlfAfterChunk = false;
|
||||||
|
responseData.erase(responseData.begin(), responseData.begin() + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto i = std::search(responseData.begin(), responseData.end(),
|
||||||
|
crlf.begin(), crlf.end());
|
||||||
|
|
||||||
|
if (i == responseData.end()) break;
|
||||||
|
|
||||||
|
const std::string line(responseData.begin(), i);
|
||||||
|
responseData.erase(responseData.begin(), i + 2);
|
||||||
|
|
||||||
|
expectedChunkSize = std::stoul(line, nullptr, 16);
|
||||||
|
if (expectedChunkSize == 0)
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
response.body.insert(response.body.end(), responseData.begin(), responseData.end());
|
||||||
|
responseData.clear();
|
||||||
|
|
||||||
|
// got the whole content
|
||||||
|
if (contentLengthReceived && response.body.size() >= contentLength)
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
WinSock winSock;
|
||||||
|
#endif // defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
InternetProtocol internetProtocol;
|
||||||
|
std::string scheme;
|
||||||
|
std::string host;
|
||||||
|
std::string domain;
|
||||||
|
std::string port;
|
||||||
|
std::string path;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HTTPREQUEST_HPP
|
BIN
PdbChecker/NET2.lib
Normal file
BIN
PdbChecker/NET2.lib
Normal file
Binary file not shown.
240
PdbChecker/Native/List.h
Normal file
240
PdbChecker/Native/List.h
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#define _defaultCapacity 4
|
||||||
|
namespace System
|
||||||
|
{
|
||||||
|
namespace Collections
|
||||||
|
{
|
||||||
|
namespace Generic
|
||||||
|
{
|
||||||
|
#ifndef PROPERTY
|
||||||
|
#define PROPERTY(t,n) __declspec( property (put = property__set_##n, get = property__get_##n)) t n
|
||||||
|
#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n
|
||||||
|
#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n
|
||||||
|
#define GET(t,n) t property__get_##n()
|
||||||
|
#define SET(t,n) void property__set_##n(const t& value)
|
||||||
|
#endif // !PROPERTY
|
||||||
|
template<typename T, class _Alloc = allocator<T>>
|
||||||
|
class List :public vector<T, _Alloc>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
List() {}
|
||||||
|
List(T* val, int len)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
this->push_back(val[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List(initializer_list<T> val)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < val.size(); i++)
|
||||||
|
{
|
||||||
|
this->push_back(val.begin()[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List(vector< T> val)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < val.size(); i++)
|
||||||
|
{
|
||||||
|
this->push_back(val[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~List() {}
|
||||||
|
T& operator[](int index)
|
||||||
|
{
|
||||||
|
return this->data()[index];
|
||||||
|
}
|
||||||
|
PROPERTY(int, Count);
|
||||||
|
GET(int, Count)
|
||||||
|
{
|
||||||
|
return this->size();
|
||||||
|
}
|
||||||
|
SET(int, Count)
|
||||||
|
{
|
||||||
|
this->resize(value);
|
||||||
|
}
|
||||||
|
void Add(T val)
|
||||||
|
{
|
||||||
|
this->push_back(val);
|
||||||
|
}
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
this->clear();
|
||||||
|
}
|
||||||
|
void AddRange(T* val, int len)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + len);
|
||||||
|
memcpy(&this->operator[](ldx), &val[0], sizeof(T) * len);
|
||||||
|
}
|
||||||
|
void AddRange(initializer_list<T>& val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val.begin()[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(List<T>& val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(List<T>* val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val->size());
|
||||||
|
memcpy(&this->data()[ldx], &val->data()[0], sizeof(T) * val->size());
|
||||||
|
}
|
||||||
|
void AddRange(vector<T>& val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(vector<T>* val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val->size());
|
||||||
|
memcpy(&this->data()[ldx], &val->data()[0], sizeof(T) * val->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Insert(int index, T val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->push_back(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, initializer_list<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, vector<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, vector<T>* val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val->begin(), val->end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, List<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, List<T>* val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val->begin(), val->end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RemoveAt(int index)
|
||||||
|
{
|
||||||
|
if (index >= 0 && index < this->size())
|
||||||
|
{
|
||||||
|
this->erase(this->begin() + index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int IndexOf(T& value)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < this->Count; i++)
|
||||||
|
{
|
||||||
|
if (this->at(i) == value)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool Contains(T& value)
|
||||||
|
{
|
||||||
|
return IndexOf(value) >= 0;
|
||||||
|
}
|
||||||
|
int LastIndexOf(T& value)
|
||||||
|
{
|
||||||
|
for (int i = this->Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (this->at(i) == value)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool Remove(T& item)
|
||||||
|
{
|
||||||
|
int num = IndexOf(item);
|
||||||
|
if (num >= 0)
|
||||||
|
{
|
||||||
|
RemoveAt(num);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
vector<T>& GetVector()
|
||||||
|
{
|
||||||
|
return *(vector<T>*)this;
|
||||||
|
}
|
||||||
|
T* Pointer()
|
||||||
|
{
|
||||||
|
return this->data();
|
||||||
|
}
|
||||||
|
T& get(int i)
|
||||||
|
{
|
||||||
|
return this->data()[i];
|
||||||
|
}
|
||||||
|
void set(int i, T val)
|
||||||
|
{
|
||||||
|
this->data()[i] = val;
|
||||||
|
}
|
||||||
|
T& First()
|
||||||
|
{
|
||||||
|
return this->data()[0];
|
||||||
|
}
|
||||||
|
T& Last()
|
||||||
|
{
|
||||||
|
return this->data()[this->size() - 1];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2763
PdbChecker/Native/Native.h
Normal file
2763
PdbChecker/Native/Native.h
Normal file
File diff suppressed because it is too large
Load Diff
2712
PdbChecker/Native/NativeFunc.h
Normal file
2712
PdbChecker/Native/NativeFunc.h
Normal file
File diff suppressed because it is too large
Load Diff
86
PdbChecker/Native/TimeSpan.h
Normal file
86
PdbChecker/Native/TimeSpan.h
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdlib.h>
|
||||||
|
struct TimeSpan
|
||||||
|
{
|
||||||
|
INT64 _ticks;
|
||||||
|
|
||||||
|
TimeSpan(INT64 ticks)
|
||||||
|
{
|
||||||
|
_ticks = ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpan(int hours, int minutes, int seconds)
|
||||||
|
{
|
||||||
|
INT64 num = (INT64)hours * 3600L + (INT64)minutes * 60L + seconds;
|
||||||
|
_ticks = num * 10000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpan(int days, int hours, int minutes, int seconds)
|
||||||
|
{
|
||||||
|
INT64 num = ((INT64)days * 3600L * 24 + (INT64)hours * 3600L + (INT64)minutes * 60L + seconds) * 1000 + 0;
|
||||||
|
_ticks = num * 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds)
|
||||||
|
{
|
||||||
|
INT64 num = ((INT64)days * 3600L * 24 + (INT64)hours * 3600L + (INT64)minutes * 60L + seconds) * 1000 + milliseconds;
|
||||||
|
_ticks = num * 10000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Add(TimeSpan ts)
|
||||||
|
{
|
||||||
|
_ticks += ts._ticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Days()
|
||||||
|
{
|
||||||
|
return (int)(_ticks / 864000000000L);
|
||||||
|
}
|
||||||
|
int Hours()
|
||||||
|
{
|
||||||
|
return (int)(_ticks / 36000000000L % 24);
|
||||||
|
}
|
||||||
|
int Milliseconds()
|
||||||
|
{
|
||||||
|
return (int)(_ticks / 10000 % 1000);
|
||||||
|
}
|
||||||
|
int Minutes()
|
||||||
|
{
|
||||||
|
return (int)(_ticks / 600000000 % 60);
|
||||||
|
}
|
||||||
|
int Seconds()
|
||||||
|
{
|
||||||
|
return (int)(_ticks / 10000000 % 60);
|
||||||
|
}
|
||||||
|
double TotalDays()
|
||||||
|
{
|
||||||
|
return (double)_ticks * 1.1574074074074074E-12;
|
||||||
|
}
|
||||||
|
double TotalHours()
|
||||||
|
{
|
||||||
|
return (double)_ticks * 2.7777777777777777E-11;
|
||||||
|
}
|
||||||
|
double TotalMilliseconds()
|
||||||
|
{
|
||||||
|
double num = (double)_ticks * 0.0001;
|
||||||
|
if (num > 922337203685477.0)
|
||||||
|
{
|
||||||
|
return 922337203685477.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num < -922337203685477.0)
|
||||||
|
{
|
||||||
|
return -922337203685477.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
double TotalMinutes()
|
||||||
|
{
|
||||||
|
return (double)_ticks * 1.6666666666666667E-09;
|
||||||
|
}
|
||||||
|
double TotalSeconds()
|
||||||
|
{
|
||||||
|
return (double)_ticks * 1E-07;
|
||||||
|
}
|
||||||
|
};
|
871
PdbChecker/PdbChecker.cpp
Normal file
871
PdbChecker/PdbChecker.cpp
Normal file
@ -0,0 +1,871 @@
|
|||||||
|
#include "Http.hpp"
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <DbgHelp.h>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <urlmon.h>
|
||||||
|
#pragma comment(lib, "urlmon.lib")
|
||||||
|
|
||||||
|
//http://www.sym101.com/Symbols/QueryModuleStruct?ModuleName=ntkrnlmp.pdb&Guid=F55005B80C686C739E763E6CF2559D9F&Agent=1&StructName=_EPROCESS&FildName=ActiveProcessLinks
|
||||||
|
#include "_helper.h"
|
||||||
|
using namespace std;
|
||||||
|
/*预定义缓存的文件列表*/
|
||||||
|
auto syspath =
|
||||||
|
{
|
||||||
|
"C:\\Windows\\System32\\hidclass.sys",
|
||||||
|
"C:\\Windows\\System32\\hidparse.sys",
|
||||||
|
"C:\\Windows\\System32\\hidusb.sys",
|
||||||
|
"C:\\Windows\\System32\\win32k.sys",
|
||||||
|
"C:\\Windows\\System32\\win32kbase.sys",
|
||||||
|
"C:\\Windows\\System32\\win32kfull.sys",
|
||||||
|
"C:\\Windows\\System32\\win32kns.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\1394ohci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\3ware.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\acpi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\AcpiDev.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\acpiex.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\acpipagr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\acpipmi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\acpitime.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Acx01000.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\adp80xx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\afd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\afunix.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\agilevpn.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ahcache.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdgpio2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdi2c.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdk8.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdppm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdsata.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdsbs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\amdxata.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\appid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\AppleSSD.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\applockerfltr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\arcsas.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\asyncmac.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\atapi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ataport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bam.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\battc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bcmfn2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\beep.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bindflt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bowser.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bridge.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BtaMPM.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BthA2dp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bthenum.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BthHfAud.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BthHfEnum.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BthMini.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bthmodem.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bthpan.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bthport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\BTHUSB.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bttflt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\buttonconverter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\bxvbda.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\CAD.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cdfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cdrom.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\CEA.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cht4dx64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cht4sx64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cht4vfx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cht4vx64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cimfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\circlass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Classpnp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cldflt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\clfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ClipSp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\CmBatt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cmimcext.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cng.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\cnghwassist.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\condrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\crashdmp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\CtiIo64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dam.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Dbgv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\devauthe.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dfsc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\disk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Diskdump.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Dmpusbstor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dmvsc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\drmk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\drmkaud.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Dumpata.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dumpfve.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dumpsd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dumpsdport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Dumpstorport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dxgkrnl.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dxgmms1.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\dxgmms2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\e3xw10x64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\EhStorClass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\EhStorTcgDrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ene.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\errdev.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\evbd0a.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\evbda.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ew_usbccgpfilter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ExecutionContext.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\exfat.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fastfat.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fdc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\filecrypt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fileinfo.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\filetrace.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\flpydisk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fltMgr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fs_rec.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fsdepends.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\fvevol.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\FWPKCLNT.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\gpuenergydrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hcmon.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hdaudbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\HdAudio.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidbatt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidbth.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidclass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidi2c.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidinterrupt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidir.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidparse.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidspi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\HidSpiCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hidusb.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\HpSAMD.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Hsp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\http.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hvcrash.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hvservice.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hvsocket.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hw_cdcacm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hw_quusbmdm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hw_quusbnet.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hw_usbdev.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hwpolicy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\hyperkbd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\HyperVideo.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\i8042prt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iagpio.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iai2c.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_GPIO2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_GPIO2_BXT_P.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_GPIO2_CNL.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_GPIO2_GLK.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_I2C.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_I2C_BXT_P.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_I2C_CNL.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSS2i_I2C_GLK.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSSi_GPIO.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaLPSSi_I2C.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaStorAVC.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iaStorV.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ibbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\IndirectKmd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\intelide.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\intelpep.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\intelpmax.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\IntelPMT.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\intelppm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\iorate.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ipfltdrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\IPMIDrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ipnat.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ipt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\isapnp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ItSas35i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\kbdclass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\kbdhid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\kdnic.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\kmpdc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\KNetPwrDepBroker.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ks.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ksecdd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ksecpkg.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ksthunk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lltdio.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lsi_sas.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lsi_sas2i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lsi_sas3i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\luafv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lxcore.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\lxss.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mausbhost.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mausbip.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\MbbCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mcd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\MegaSas2i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\megasas35i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\megasr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Microsoft.Bluetooth.AvrcpTransport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Microsoft.Bluetooth.Legacy.LEEnumerator.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mlx4_bus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mmcss.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\modem.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\monitor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mouclass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mouhid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mountmgr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mpi3drvi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mpsdrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mrxdav.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mrxsmb.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mrxsmb10.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mrxsmb20.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msgpioclx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msgpiowin32.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mshidkmdf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mshidumdf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mshwnclx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msihid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\MsIo64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msisadrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msiscsi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mskssrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mslldp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mspclock.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mspqm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msquic.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\msrpc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mssmbios.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mstee.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\MTConfig.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mup.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\mvumis.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Nahimic_Mirroring.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndfltr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndis.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndiscap.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\NdisImPlatform.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndistapi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndisuio.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\NdisVirtualBus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndiswan.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\NDKPerf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\NDKPing.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ndproxy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Ndu.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\NetAdapterCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\netbios.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\netbt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\netio.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\netvsc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Netwtw10.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\npfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\npsvctrig.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nsiproxy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ntfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ntosext.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\null.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvdimm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvhda64v.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvmedisk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvpcf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvraid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nvstor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\nwifi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\p9rdr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pacer.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\parport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\partmgr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pciide.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pciidex.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pcmcia.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pcw.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pdc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\PEAuth.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\percsas2i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\percsas3i.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\PktMon.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pmem.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\pnpmem.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\portcfg.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\portcls.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\prjflt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\processr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ProcLaunchMon.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\qwavedrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ramdisk.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rasacd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rasl2tp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\raspppoe.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\raspptp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rassstp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rdbss.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rdpbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rdpdr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rdpvideominiport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rdyboost.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\refs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\refsv1.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rfcomm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rhproxy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rmcast.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\RNDISMP.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rootmdm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rspndr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\rteth.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\RTKVHD64.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\RtsPer.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sbp2port.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\scfilter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\scmbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\scsiport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sdbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SDFRd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sdport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sdstor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SerCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SerCx2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\serenum.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\serial.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sermouse.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sfloppy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SgrmAgent.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sisraid2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sisraid4.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SleepStudyHelper.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SmartSAMD.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\smclib.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\spacedump.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\spaceparser.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\spaceport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SpatialGraphFilter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\SpbCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\srv2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\srvnet.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ssbthid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ssdevfactory.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\sshid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ssps2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\stexstor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\storahci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\stornvme.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\storport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\storqosflt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\storufs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\storvsc.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\stream.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\STTub30.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tape.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tbs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\TbtBusDrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tcpip.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tcpipreg.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tdi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tdx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\terminpt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tpm.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\TsUsbFlt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\TsUsbGD.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\tunnel.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\uaspstor.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\UcmCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\UcmTcpciCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\UcmUcsiAcpiClient.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\UcmUcsiCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Ucx01000.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Udecx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\udfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ufx01000.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ufxsynopsys.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\umpass.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\urscx01000.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usb8023.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\USBAUDIO.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbaudio2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\USBCAMD2.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbccgp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbcir.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbehci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbhub.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\USBHUB3.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbohci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\UsbPmApi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbport.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbprint.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbser.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\USBSTOR.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbuhci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\usbvideo.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\USBXHCI.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vdrvroot.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\VerifierExt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vhdmp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vhf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Vid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\videoprt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmbkmcl.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmbkmclr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmbus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\VMBusHID.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmgencounter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmgid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmnet.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmnetadapter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmnetbridge.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmnetuserif.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vms3cap.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\VmsProxy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\VmsProxyHNic.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmstorfl.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmswitch.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vmx86.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\volmgr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\volmgrx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\volsnap.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\volume.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vpci.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vsmraid.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vsock.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\VSTXRAID.SYS",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vwifibus.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vwififlt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\vwifimp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wacompen.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wanarp.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\watchdog.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wcifs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdBoot.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdDevFlt.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\Wdf01000.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdFilter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdfLdr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdiWiFi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdmCompanionFilter.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WdNisDrv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\werkernel.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wfplwfs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WifiCx.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wimmount.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WindowsTrustedRT.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WindowsTrustedRTProxy.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winhv.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winhvr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winmad.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winnat.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winusb.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\winverbs.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wmiacpi.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wmilib.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\wof.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WpdUpFltr.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WppRecorder.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\ws2ifsl.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WUDFPf.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\WUDFRd.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\xboxgip.sys",
|
||||||
|
"C:\\Windows\\System32\\drivers\\xinputhid.sys",
|
||||||
|
|
||||||
|
"C:\\Windows\\System32\\ntoskrnl.exe",
|
||||||
|
"C:\\Windows\\System32\\dwm.exe",
|
||||||
|
"C:\\Windows\\System32\\dwmcore.dll",
|
||||||
|
"C:\\Windows\\System32\\dwmscene.dll",
|
||||||
|
"C:\\Windows\\System32\\uDWM.dll",
|
||||||
|
"C:\\Windows\\System32\\rdsdwmdr.dll",
|
||||||
|
"C:\\Windows\\System32\\dwmredir.dll",
|
||||||
|
"C:\\Windows\\System32\\dwmapi.dll",
|
||||||
|
"C:\\Windows\\System32\\dwm.exe",
|
||||||
|
"C:\\Windows\\System32\\dwminit.dll",
|
||||||
|
"C:\\Windows\\System32\\dwmghost.dll",
|
||||||
|
"C:\\Windows\\System32\\dxgi.dll",
|
||||||
|
"C:\\Windows\\System32\\dxgwdi.dll",
|
||||||
|
"C:\\Windows\\System32\\DXGIDebug.dll",
|
||||||
|
"C:\\Windows\\System32\\lsass.exe",
|
||||||
|
"C:\\Windows\\System32\\csrss.exe",
|
||||||
|
"C:\\Windows\\explorer.exe",
|
||||||
|
"C:\\Windows\\System32\\d2d1.dll",
|
||||||
|
"C:\\Windows\\System32\\DWrite.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10_1.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10_1core.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10core.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10level9.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10ref.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10sdklayers.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d10warp.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d11.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d11_3SDKLayers.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d11on12.dll",
|
||||||
|
"C:\\Windows\\System32\\D3D12.dll",
|
||||||
|
"C:\\Windows\\System32\\D3D12Core.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d12SDKLayers.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d8thk.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d9.dll",
|
||||||
|
"C:\\Windows\\System32\\d3d9on12.dll",
|
||||||
|
"C:\\Windows\\System32\\d3dconfig.exe",
|
||||||
|
"C:\\Windows\\System32\\d3dcsx_42.dll",
|
||||||
|
"C:\\Windows\\System32\\d3dcsx_43.dll",
|
||||||
|
"C:\\Windows\\System32\\d3dref9.dll",
|
||||||
|
"C:\\Windows\\System32\\D3DSCache.dll",
|
||||||
|
"C:\\Windows\\System32\\d3dx10.dll",
|
||||||
|
"C:\\Windows\\System32\\DXCore.dll"
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
IMAGE_DEBUG_DIRECTORY_RAW GetPEHeaderInfo(const char* PEFileName)
|
||||||
|
{
|
||||||
|
FILE* File = nullptr;
|
||||||
|
auto err = fopen_s(&File, PEFileName, "rb");
|
||||||
|
if (err != 0)
|
||||||
|
{
|
||||||
|
return { 0 };
|
||||||
|
}
|
||||||
|
IMAGE_DOS_HEADER DosHeader;
|
||||||
|
fread(&DosHeader, sizeof(IMAGE_DOS_HEADER), 1, File);
|
||||||
|
fseek(File, DosHeader.e_lfanew, SEEK_SET);
|
||||||
|
uint32_t NtHeadersSignature;
|
||||||
|
fread(&NtHeadersSignature, 4, 1, File);
|
||||||
|
|
||||||
|
IMAGE_FILE_HEADER FileHeader;
|
||||||
|
fread(&FileHeader, sizeof(IMAGE_FILE_HEADER), 1, File);
|
||||||
|
|
||||||
|
uint32_t is32BitHeader = FileHeader.Machine == IMAGE_FILE_MACHINE_I386;
|
||||||
|
|
||||||
|
IMAGE_OPTIONAL_HEADER32 OptionalHeader32 = { 0 };
|
||||||
|
IMAGE_OPTIONAL_HEADER64 OptionalHeader64 = { 0 };
|
||||||
|
|
||||||
|
if (is32BitHeader)
|
||||||
|
fread(&OptionalHeader32, sizeof(IMAGE_OPTIONAL_HEADER32), 1, File);
|
||||||
|
else
|
||||||
|
fread(&OptionalHeader64, sizeof(IMAGE_OPTIONAL_HEADER64), 1, File);
|
||||||
|
|
||||||
|
uint32_t offDebug = 0;
|
||||||
|
uint32_t cbFromHeader = 0;
|
||||||
|
|
||||||
|
uint32_t cbDebug = is32BitHeader ?
|
||||||
|
OptionalHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size : OptionalHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
|
||||||
|
|
||||||
|
for (int HeaderNo = 0; HeaderNo < FileHeader.NumberOfSections; ++HeaderNo) {
|
||||||
|
IMAGE_SECTION_HEADER SectionHeader;
|
||||||
|
fread(&SectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, File);
|
||||||
|
|
||||||
|
if ((SectionHeader.PointerToRawData != 0) && (SectionHeader.SizeOfRawData != 0) &&
|
||||||
|
(cbFromHeader < (SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData))) {
|
||||||
|
cbFromHeader = SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cbDebug != 0) {
|
||||||
|
if (is32BitHeader) {
|
||||||
|
if (SectionHeader.VirtualAddress <= OptionalHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress &&
|
||||||
|
((SectionHeader.VirtualAddress + SectionHeader.SizeOfRawData) > OptionalHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress)) {
|
||||||
|
offDebug = OptionalHeader32.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
if (SectionHeader.VirtualAddress <= OptionalHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress &&
|
||||||
|
((SectionHeader.VirtualAddress + SectionHeader.SizeOfRawData) > OptionalHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress)) {
|
||||||
|
offDebug = OptionalHeader64.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(File, offDebug, SEEK_SET);
|
||||||
|
|
||||||
|
uint8_t loopexit = FALSE;
|
||||||
|
|
||||||
|
IMAGE_DEBUG_DIRECTORY_RAW DebugRaw;
|
||||||
|
while (cbDebug >= sizeof(IMAGE_DEBUG_DIRECTORY)) {
|
||||||
|
|
||||||
|
if (loopexit == FALSE) {
|
||||||
|
|
||||||
|
IMAGE_DEBUG_DIRECTORY DebugDirectory;
|
||||||
|
|
||||||
|
fread(&DebugDirectory, sizeof(IMAGE_DEBUG_DIRECTORY), 1, File);
|
||||||
|
|
||||||
|
uint32_t seekPosition = ftell(File);
|
||||||
|
|
||||||
|
if (DebugDirectory.Type == IMAGE_DEBUG_TYPE_CODEVIEW) {
|
||||||
|
fseek(File, DebugDirectory.PointerToRawData, SEEK_SET);
|
||||||
|
fread(&DebugRaw, sizeof(IMAGE_DEBUG_DIRECTORY_RAW), 1, File);
|
||||||
|
loopexit = TRUE;
|
||||||
|
|
||||||
|
if (strstr((char*)DebugRaw.ImageName, ".ni.") != 0) {
|
||||||
|
fseek(File, seekPosition, SEEK_SET);
|
||||||
|
loopexit = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((DebugDirectory.PointerToRawData != 0) && (DebugDirectory.SizeOfData != 0) &&
|
||||||
|
(cbFromHeader < (DebugDirectory.PointerToRawData + DebugDirectory.SizeOfData))) {
|
||||||
|
cbFromHeader = DebugDirectory.PointerToRawData + DebugDirectory.SizeOfData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cbDebug -= sizeof(IMAGE_DEBUG_DIRECTORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(File);
|
||||||
|
return DebugRaw;
|
||||||
|
}
|
||||||
|
void CheckPdb(const char* filepath)
|
||||||
|
{
|
||||||
|
auto pe = GetPEHeaderInfo(filepath);
|
||||||
|
if (pe.PdbDbiAge == 0) return;
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto guid = pe.GuidString();
|
||||||
|
int age = pe.PdbDbiAge;
|
||||||
|
char _url[2048];
|
||||||
|
sprintf_s(_url,
|
||||||
|
"http://www.sym101.com/Symbols/SymbolCheck?ModuleName=%s&Guid=%s&Agent=%d",
|
||||||
|
(char*)pe.ImageName,
|
||||||
|
guid,
|
||||||
|
age
|
||||||
|
);
|
||||||
|
auto dta = WebRequest(_url);
|
||||||
|
delete guid;
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
if ((char)dta[0] == '1')
|
||||||
|
{
|
||||||
|
cout << "[+] " << filepath << " -> " << (char*)pe.ImageName << " 缓存完毕 " << endl;
|
||||||
|
}
|
||||||
|
else if ((char)dta[0] == '0')
|
||||||
|
{
|
||||||
|
cout << "[*] " << filepath << " 不存在该文件的pdb " << endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "[-] " << filepath << " -----------未知状态--------------------- " << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cout << "[-] " << filepath << " 缓存失败 " << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout<< e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__int32 GetFileProcOffset(const char* filepath, const char* proc)
|
||||||
|
{
|
||||||
|
auto pe = GetPEHeaderInfo(filepath);
|
||||||
|
if (pe.PdbDbiAge == 0) return -1;
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto guid = pe.GuidString();
|
||||||
|
int age = pe.PdbDbiAge;
|
||||||
|
char _url[2048];
|
||||||
|
sprintf_s(_url,
|
||||||
|
"http://www.sym101.com/Symbols/QueryModuleSymbol?ModuleName=%s&Guid=%s&Agent=%d&QueryName=%s",
|
||||||
|
(char*)pe.ImageName,
|
||||||
|
guid,
|
||||||
|
age,
|
||||||
|
proc
|
||||||
|
);
|
||||||
|
auto dta = HttpRequest(_url);
|
||||||
|
delete guid;
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
return atoi((char*)dta.data());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout << e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int GetFileStructFildOffset(const char* filepath, const char* structname, const char* fildname)
|
||||||
|
{
|
||||||
|
auto pe = GetPEHeaderInfo(filepath);
|
||||||
|
if (pe.PdbDbiAge == 0) return -1;
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto guid = pe.GuidString();
|
||||||
|
int age = pe.PdbDbiAge;
|
||||||
|
char _url[2048];
|
||||||
|
sprintf_s(_url,
|
||||||
|
"http://www.sym101.com/Symbols/QueryModuleStructFildOffset?ModuleName=%s&Guid=%s&Agent=%d&StructName=%s&FildName=%s",
|
||||||
|
(char*)pe.ImageName,
|
||||||
|
guid,
|
||||||
|
age,
|
||||||
|
structname,
|
||||||
|
fildname
|
||||||
|
);
|
||||||
|
auto dta = HttpRequest(_url);
|
||||||
|
delete guid;
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
return atoi((char*)dta.data());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout << e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
vector<BYTE> GetFilePdb(const char* filepath)
|
||||||
|
{
|
||||||
|
auto pe = GetPEHeaderInfo(filepath);
|
||||||
|
if (pe.PdbDbiAge == 0) return vector<BYTE>();
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
auto guid = pe.GuidString();
|
||||||
|
int age = pe.PdbDbiAge;
|
||||||
|
char _url[2048];
|
||||||
|
//下载对应pdb文件,GZip将pdb文件压缩后再转换为HEX格式的字符串
|
||||||
|
sprintf_s(_url,
|
||||||
|
"http://www.sym101.com/Symbols/SymbolDownLoad?ModuleName=%s&Guid=%s&Agent=%d",
|
||||||
|
(char*)pe.ImageName,
|
||||||
|
guid,
|
||||||
|
age
|
||||||
|
);
|
||||||
|
auto dta = HttpRequest(_url);
|
||||||
|
delete guid;
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
auto hex=ParseHex((const char*)dta.data());
|
||||||
|
return GDecompress(hex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout << e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
//DownLoadPdb
|
||||||
|
|
||||||
|
vector<BYTE> GetSysFile()
|
||||||
|
{
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
char _url[] = "http://www.sym101.com/Users/FileDownLoad?Filename=kemode.sys";
|
||||||
|
auto dta = HttpRequest(_url);
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
auto hex = ParseHex((const char*)dta.data());
|
||||||
|
return GDecompress(hex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout << e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<BYTE> GetSysFileGZ()
|
||||||
|
{
|
||||||
|
int errorcount = 0;
|
||||||
|
retry:
|
||||||
|
try
|
||||||
|
{
|
||||||
|
char _url[] = "http://www.sym101.com/Users/FileDownLoadGZ?Filename=kemode.sys";
|
||||||
|
auto dta = HttpRequest(_url);
|
||||||
|
if (dta.size() > 0)
|
||||||
|
{
|
||||||
|
auto hex = ParseHex((const char*)dta.data());
|
||||||
|
return GDecompress(hex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
cout << e.what() << endl;
|
||||||
|
if (errorcount++ < 10)
|
||||||
|
{
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return vector<BYTE>();
|
||||||
|
}
|
||||||
|
void KeyDown(int v)
|
||||||
|
{
|
||||||
|
cout << (PVOID)v << endl;
|
||||||
|
}
|
||||||
|
int main(int agec, char** agev)
|
||||||
|
{
|
||||||
|
auto xbuffer = GetFilePdb("C:\\Battlestate Games\\EFT\\UnityPlayer.dll");
|
||||||
|
if (agec < 2)//直接启动
|
||||||
|
{
|
||||||
|
for (int i = 0; i < syspath.size(); i++)
|
||||||
|
{
|
||||||
|
auto buffer=GetFilePdb(syspath.begin()[i]);
|
||||||
|
cout << syspath.begin()[i] << "\t" << buffer.size() << endl;
|
||||||
|
}
|
||||||
|
cout << "所有文件缓存完毕 " << endl;
|
||||||
|
Sleep(1000);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//拖放文件启动
|
||||||
|
for (int i = 1; i < agec; i++)
|
||||||
|
{
|
||||||
|
CheckPdb(agev[i]);
|
||||||
|
}
|
||||||
|
cout << "所有文件缓存完毕 " << endl;
|
||||||
|
Sleep(1000);
|
||||||
|
}
|
185
PdbChecker/PdbChecker.vcxproj
Normal file
185
PdbChecker/PdbChecker.vcxproj
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{bb78e585-c6e4-4da5-a622-e4182879747b}</ProjectGuid>
|
||||||
|
<RootNamespace>PdbChecker</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>false</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="PdbChecker.cpp" />
|
||||||
|
<ClCompile Include="zlib\adler32.c" />
|
||||||
|
<ClCompile Include="zlib\compress.c" />
|
||||||
|
<ClCompile Include="zlib\crc32.c" />
|
||||||
|
<ClCompile Include="zlib\deflate.c" />
|
||||||
|
<ClCompile Include="zlib\infback.c" />
|
||||||
|
<ClCompile Include="zlib\inffast.c" />
|
||||||
|
<ClCompile Include="zlib\inflate.c" />
|
||||||
|
<ClCompile Include="zlib\inftrees.c" />
|
||||||
|
<ClCompile Include="zlib\trees.c" />
|
||||||
|
<ClCompile Include="zlib\uncompr.c" />
|
||||||
|
<ClCompile Include="zlib\zutil.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="_helper.h" />
|
||||||
|
<ClInclude Include="Http.hpp" />
|
||||||
|
<ClInclude Include="zlib\crc32.h" />
|
||||||
|
<ClInclude Include="zlib\deflate.h" />
|
||||||
|
<ClInclude Include="zlib\gzguts.h" />
|
||||||
|
<ClInclude Include="zlib\inffast.h" />
|
||||||
|
<ClInclude Include="zlib\inffixed.h" />
|
||||||
|
<ClInclude Include="zlib\inflate.h" />
|
||||||
|
<ClInclude Include="zlib\inftrees.h" />
|
||||||
|
<ClInclude Include="zlib\trees.h" />
|
||||||
|
<ClInclude Include="zlib\zconf.h" />
|
||||||
|
<ClInclude Include="zlib\zlib.h" />
|
||||||
|
<ClInclude Include="zlib\zutil.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="zlib\Makefile.am" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
104
PdbChecker/PdbChecker.vcxproj.filters
Normal file
104
PdbChecker/PdbChecker.vcxproj.filters
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="zlib">
|
||||||
|
<UniqueIdentifier>{65a44dc0-ce01-4e2c-be2d-7cdc756604ba}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="PdbChecker.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\adler32.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\compress.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\crc32.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\deflate.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\infback.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\inffast.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\inflate.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\inftrees.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\trees.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\uncompr.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="zlib\zutil.c">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Http.hpp">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\crc32.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\deflate.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\gzguts.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\inffast.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\inffixed.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\inflate.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\inftrees.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\trees.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\zconf.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\zlib.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="zlib\zutil.h">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="_helper.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="zlib\Makefile.am">
|
||||||
|
<Filter>zlib</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
462
PdbChecker/_helper.h
Normal file
462
PdbChecker/_helper.h
Normal file
@ -0,0 +1,462 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <vector>
|
||||||
|
#include "zlib\zlib.h"
|
||||||
|
#include <WinInet.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <urlmon.h>
|
||||||
|
#pragma comment(lib, "urlmon.lib")
|
||||||
|
#pragma comment(lib, "Wininet.lib")
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#ifndef _IMAGE_DEBUG_DIRECTORY_RAW_
|
||||||
|
#define _IMAGE_DEBUG_DIRECTORY_RAW_
|
||||||
|
typedef struct _IMAGE_DEBUG_DIRECTORY_RAW {
|
||||||
|
uint8_t format[4];
|
||||||
|
uint8_t PdbSignature[16];
|
||||||
|
uint32_t PdbDbiAge;
|
||||||
|
uint8_t ImageName[256];
|
||||||
|
const char* GuidString()
|
||||||
|
{
|
||||||
|
char* buf = new char[128];
|
||||||
|
sprintf(buf, "%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X",
|
||||||
|
this->PdbSignature[3], this->PdbSignature[2],
|
||||||
|
this->PdbSignature[1], this->PdbSignature[0],
|
||||||
|
this->PdbSignature[5], this->PdbSignature[4],
|
||||||
|
this->PdbSignature[7], this->PdbSignature[6],
|
||||||
|
this->PdbSignature[8], this->PdbSignature[9],
|
||||||
|
this->PdbSignature[10], this->PdbSignature[11],
|
||||||
|
this->PdbSignature[12], this->PdbSignature[13],
|
||||||
|
this->PdbSignature[14], this->PdbSignature[15]
|
||||||
|
);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
} IMAGE_DEBUG_DIRECTORY_RAW, * PIMAGE_DEBUG_DIRECTORY_RAW;
|
||||||
|
#endif
|
||||||
|
static vector<BYTE> Compress(BYTE* buffer, int len)
|
||||||
|
{
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
uLong destLen = compressBound(len);
|
||||||
|
unsigned char* ostream = (unsigned char*)malloc(destLen);
|
||||||
|
int res = compress(ostream, &destLen, (const unsigned char*)buffer, len);
|
||||||
|
if (res == Z_BUF_ERROR) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (res == Z_MEM_ERROR) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
int ldx = result.size();
|
||||||
|
result.resize(destLen);
|
||||||
|
memcpy(&result.operator[](ldx), ostream, destLen);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static vector<BYTE> Decompress(BYTE* buffer, int len, int maxlen)
|
||||||
|
{
|
||||||
|
uLong destLen = maxlen;
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
BYTE* o2stream = new BYTE[maxlen];
|
||||||
|
int des = uncompress(o2stream, &destLen, buffer, len);
|
||||||
|
result.resize(destLen);
|
||||||
|
memcpy(result.data(), o2stream, destLen);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static vector<BYTE> GDecompress(vector<BYTE> compressedBytes) {
|
||||||
|
vector<BYTE> uncompressedBytes = vector<BYTE>();
|
||||||
|
if (compressedBytes.size() == 0)return uncompressedBytes;
|
||||||
|
unsigned full_length = compressedBytes.size();
|
||||||
|
unsigned half_length = compressedBytes.size() / 2;
|
||||||
|
|
||||||
|
unsigned uncompLength = full_length;
|
||||||
|
char* uncomp = (char*)calloc(sizeof(char), uncompLength);
|
||||||
|
|
||||||
|
z_stream strm;
|
||||||
|
strm.next_in = (Bytef*)compressedBytes.data();
|
||||||
|
strm.avail_in = compressedBytes.size();
|
||||||
|
strm.total_out = 0;
|
||||||
|
strm.zalloc = Z_NULL;
|
||||||
|
strm.zfree = Z_NULL;
|
||||||
|
|
||||||
|
bool done = false;
|
||||||
|
|
||||||
|
if (inflateInit2(&strm, (16 + MAX_WBITS)) != Z_OK) {
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
if (strm.total_out >= uncompLength) {
|
||||||
|
char* uncomp2 = (char*)calloc(sizeof(char), uncompLength + half_length);
|
||||||
|
memcpy(uncomp2, uncomp, uncompLength);
|
||||||
|
uncompLength += half_length;
|
||||||
|
free(uncomp);
|
||||||
|
uncomp = uncomp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_out = (Bytef*)(uncomp + strm.total_out);
|
||||||
|
strm.avail_out = uncompLength - strm.total_out;
|
||||||
|
int err = inflate(&strm, Z_SYNC_FLUSH);
|
||||||
|
if (err == Z_STREAM_END) done = true;
|
||||||
|
else if (err != Z_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inflateEnd(&strm) != Z_OK) {
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < strm.total_out; ++i) {
|
||||||
|
uncompressedBytes.push_back(uncomp[i]);
|
||||||
|
}
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
static vector<BYTE> GCompress(vector<BYTE> input)
|
||||||
|
{
|
||||||
|
vector<BYTE> res = vector<BYTE>();
|
||||||
|
res.resize(input.size());
|
||||||
|
z_stream zs;
|
||||||
|
zs.zalloc = Z_NULL;
|
||||||
|
zs.zfree = Z_NULL;
|
||||||
|
zs.opaque = Z_NULL;
|
||||||
|
zs.avail_in = (uInt)input.size();
|
||||||
|
zs.next_in = (Bytef*)input.data();
|
||||||
|
zs.avail_out = (uInt)input.size();
|
||||||
|
zs.next_out = (Bytef*)res.data();
|
||||||
|
deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
deflate(&zs, Z_FINISH);
|
||||||
|
deflateEnd(&zs);
|
||||||
|
res.resize(zs.total_out);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static vector<BYTE> GDecompress(BYTE* compressedBytes,ULONG len) {
|
||||||
|
vector<BYTE> uncompressedBytes = vector<BYTE>();
|
||||||
|
if (len == 0)return uncompressedBytes;
|
||||||
|
unsigned full_length = len;
|
||||||
|
unsigned half_length = len / 2;
|
||||||
|
|
||||||
|
unsigned uncompLength = full_length;
|
||||||
|
char* uncomp = (char*)calloc(sizeof(char), uncompLength);
|
||||||
|
|
||||||
|
z_stream strm;
|
||||||
|
strm.next_in = compressedBytes;
|
||||||
|
strm.avail_in = len;
|
||||||
|
strm.total_out = 0;
|
||||||
|
strm.zalloc = Z_NULL;
|
||||||
|
strm.zfree = Z_NULL;
|
||||||
|
|
||||||
|
bool done = false;
|
||||||
|
|
||||||
|
if (inflateInit2(&strm, (16 + MAX_WBITS)) != Z_OK) {
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
if (strm.total_out >= uncompLength) {
|
||||||
|
char* uncomp2 = (char*)calloc(sizeof(char), uncompLength + half_length);
|
||||||
|
memcpy(uncomp2, uncomp, uncompLength);
|
||||||
|
uncompLength += half_length;
|
||||||
|
free(uncomp);
|
||||||
|
uncomp = uncomp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_out = (Bytef*)(uncomp + strm.total_out);
|
||||||
|
strm.avail_out = uncompLength - strm.total_out;
|
||||||
|
int err = inflate(&strm, Z_SYNC_FLUSH);
|
||||||
|
if (err == Z_STREAM_END) done = true;
|
||||||
|
else if (err != Z_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inflateEnd(&strm) != Z_OK) {
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < strm.total_out; ++i) {
|
||||||
|
uncompressedBytes.push_back(uncomp[i]);
|
||||||
|
}
|
||||||
|
free(uncomp);
|
||||||
|
return uncompressedBytes;
|
||||||
|
}
|
||||||
|
static vector<BYTE> GCompress(BYTE* input,ULONG len)
|
||||||
|
{
|
||||||
|
vector<BYTE> res = vector<BYTE>();
|
||||||
|
res.resize(len);
|
||||||
|
z_stream zs;
|
||||||
|
zs.zalloc = Z_NULL;
|
||||||
|
zs.zfree = Z_NULL;
|
||||||
|
zs.opaque = Z_NULL;
|
||||||
|
zs.avail_in = (uInt)len;
|
||||||
|
zs.next_in = (Bytef*)input;
|
||||||
|
zs.avail_out = (uInt)len;
|
||||||
|
zs.next_out = (Bytef*)res.data();
|
||||||
|
deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | 16, 8, Z_DEFAULT_STRATEGY);
|
||||||
|
deflate(&zs, Z_FINISH);
|
||||||
|
deflateEnd(&zs);
|
||||||
|
res.resize(zs.total_out);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static vector<BYTE> GCompress(initializer_list<BYTE> input)
|
||||||
|
{
|
||||||
|
return GCompress((BYTE*)input.begin(), input.size());
|
||||||
|
}
|
||||||
|
static vector<BYTE> GCompress(initializer_list<BYTE>* input)
|
||||||
|
{
|
||||||
|
return GCompress((BYTE*)input->begin(), input->size());
|
||||||
|
}
|
||||||
|
static char* ToHex(const char* data, size_t len)
|
||||||
|
{
|
||||||
|
const char* key = "0123456789ABCDEF";
|
||||||
|
char* result = new char[len * 2];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
result[i * 2] = key[(BYTE)(data[i] >> 4)];
|
||||||
|
result[(i * 2) + 1] = key[(BYTE)((BYTE)(data[i] << 4) >> 4)];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static char* ToHex(const BYTE* data, size_t len)
|
||||||
|
{
|
||||||
|
const char* key = "0123456789ABCDEF";
|
||||||
|
char* result = new char[(len * 2) + 1];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
result[i * 2] = key[(BYTE)(data[i] >> 4)];
|
||||||
|
result[(i * 2) + 1] = key[(BYTE)((BYTE)(data[i] << 4) >> 4)];
|
||||||
|
}
|
||||||
|
result[len * 2] = '\0';
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static vector<BYTE> ParseHex(const char* hex)
|
||||||
|
{
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
int len = strlen(hex);
|
||||||
|
BYTE* buffer = new BYTE[len];
|
||||||
|
bool ish = true;
|
||||||
|
BYTE val = 0;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
bool isval = false;
|
||||||
|
BYTE v = 0;
|
||||||
|
if (hex[i] >= '0' && hex[i] <= '9')
|
||||||
|
{
|
||||||
|
v = (hex[i] - '0');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
else if (hex[i] >= 'A' && hex[i] <= 'F')
|
||||||
|
{
|
||||||
|
v = 10 + (hex[i] - 'A');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
else if (hex[i] >= 'a' && hex[i] <= 'f')
|
||||||
|
{
|
||||||
|
v = 10 + (hex[i] - 'a');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
if (isval)
|
||||||
|
{
|
||||||
|
if (ish)
|
||||||
|
{
|
||||||
|
val = (v << 4) | val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val = v | val;
|
||||||
|
result.push_back(val);
|
||||||
|
val = 0;
|
||||||
|
}
|
||||||
|
ish = !ish;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static initializer_list<BYTE>* ReadAllBytes(const char* filePath)
|
||||||
|
{
|
||||||
|
HANDLE pFile;
|
||||||
|
DWORD fileSize;
|
||||||
|
char* buffer, * tmpBuf;
|
||||||
|
DWORD dwBytesRead, dwBytesToRead, tmpLen;
|
||||||
|
|
||||||
|
pFile = CreateFileA(filePath,
|
||||||
|
GENERIC_READ,
|
||||||
|
FILE_SHARE_READ,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (pFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
fileSize = GetFileSize(pFile, NULL);
|
||||||
|
buffer = (char*)malloc(fileSize);
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
ZeroMemory(buffer, fileSize);
|
||||||
|
dwBytesToRead = fileSize;
|
||||||
|
dwBytesRead = 0;
|
||||||
|
tmpBuf = buffer;
|
||||||
|
do {
|
||||||
|
if (!ReadFile(pFile, tmpBuf, dwBytesToRead, &dwBytesRead, NULL) || dwBytesRead == 0)
|
||||||
|
break;
|
||||||
|
dwBytesToRead -= dwBytesRead;
|
||||||
|
tmpBuf += dwBytesRead;
|
||||||
|
|
||||||
|
} while (dwBytesToRead > 0);
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return new initializer_list<BYTE>((BYTE*)&buffer[0], (BYTE*)&buffer[fileSize]);
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, char* buffer, int len)
|
||||||
|
{
|
||||||
|
HANDLE pFile;
|
||||||
|
char* tmpBuf;
|
||||||
|
DWORD dwBytesWrite, dwBytesToWrite;
|
||||||
|
|
||||||
|
pFile = CreateFileA(filePath,
|
||||||
|
GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (pFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwBytesToWrite = len;
|
||||||
|
dwBytesWrite = 0;
|
||||||
|
|
||||||
|
tmpBuf = buffer;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
WriteFile(pFile, tmpBuf, dwBytesToWrite, &dwBytesWrite, NULL);
|
||||||
|
|
||||||
|
dwBytesToWrite -= dwBytesWrite;
|
||||||
|
tmpBuf += dwBytesWrite;
|
||||||
|
|
||||||
|
} while (dwBytesToWrite > 0);
|
||||||
|
|
||||||
|
CloseHandle(pFile);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, BYTE* buffer, int len)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath,(char*)buffer,len);
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, vector<BYTE> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.data(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, initializer_list<BYTE> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.begin(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, initializer_list<BYTE>* buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer->begin(), buffer->size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, initializer_list<char> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.begin(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllText(const char* filePath, const char* text)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)text, strlen(text));
|
||||||
|
}
|
||||||
|
static vector<BYTE> HttpRequest(const char* url)
|
||||||
|
{
|
||||||
|
#define MAXSIZE 4096
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
BYTE* val = new BYTE[MAXSIZE];
|
||||||
|
ULONG len = 1;
|
||||||
|
HINTERNET hSession = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
|
||||||
|
if (hSession != NULL)
|
||||||
|
{
|
||||||
|
HINTERNET hHttp = InternetOpenUrlA(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
|
||||||
|
|
||||||
|
if (hHttp != NULL)
|
||||||
|
{
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
InternetReadFile(hHttp, val, MAXSIZE - 1, &len);
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
int ldx = result.size();
|
||||||
|
result.resize(result.size() + len);
|
||||||
|
memcpy(&result.operator[](ldx), &val[0], len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InternetCloseHandle(hHttp);
|
||||||
|
hHttp = NULL;
|
||||||
|
}
|
||||||
|
InternetCloseHandle(hSession);
|
||||||
|
hSession = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static string GetPathFolder(const char* path)
|
||||||
|
{
|
||||||
|
int len = strlen(path);
|
||||||
|
char* res = new char[len];
|
||||||
|
strcpy(res, path);
|
||||||
|
for (int i = len - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (res[i] == '\\')
|
||||||
|
{
|
||||||
|
res[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static string GetFileNameByPath(const char* path)
|
||||||
|
{
|
||||||
|
int len = strlen(path);
|
||||||
|
char* res = new char[len];
|
||||||
|
strcpy(res, path);
|
||||||
|
for (int i = len - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (res[i] == '\\')
|
||||||
|
{
|
||||||
|
return &res[i+1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
static string WebRequest(const char* url)
|
||||||
|
{
|
||||||
|
IStream* stream;
|
||||||
|
HRESULT result = URLOpenBlockingStreamA(0, url, &stream, 0, 0);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
char buffer[4096];
|
||||||
|
unsigned long bytesRead;
|
||||||
|
stringstream ss;
|
||||||
|
stream->Read(buffer, 4096, &bytesRead);
|
||||||
|
while (bytesRead > 0U)
|
||||||
|
{
|
||||||
|
ss.write(buffer, (long long)bytesRead);
|
||||||
|
stream->Read(buffer, 4096, &bytesRead);
|
||||||
|
}
|
||||||
|
stream->Release();
|
||||||
|
return ss.str();
|
||||||
|
}
|
34
PdbChecker/zlib/Makefile.am
Normal file
34
PdbChecker/zlib/Makefile.am
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
MAKEFLAGS := $(MAKEFLAGS) --no-builtin-rules
|
||||||
|
|
||||||
|
ZLIB_SOURCE = \
|
||||||
|
adler32.c \
|
||||||
|
compress.c \
|
||||||
|
crc32.c \
|
||||||
|
uncompr.c \
|
||||||
|
deflate.c \
|
||||||
|
gzguts.h \
|
||||||
|
trees.c \
|
||||||
|
zutil.c \
|
||||||
|
inflate.c \
|
||||||
|
infback.c \
|
||||||
|
inftrees.c \
|
||||||
|
inffast.c \
|
||||||
|
crc32.h \
|
||||||
|
deflate.h \
|
||||||
|
inffast.h \
|
||||||
|
inffixed.h \
|
||||||
|
inflate.h \
|
||||||
|
inftrees.h \
|
||||||
|
trees.h \
|
||||||
|
zconf.h \
|
||||||
|
zlib.h \
|
||||||
|
zutil.h
|
||||||
|
|
||||||
|
if !HAVE_SYS_ZLIB
|
||||||
|
if !HAVE_STATIC_ZLIB
|
||||||
|
noinst_LTLIBRARIES = libz.la
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
libz_la_SOURCES = \
|
||||||
|
$(ZLIB_SOURCE)
|
186
PdbChecker/zlib/adler32.c
Normal file
186
PdbChecker/zlib/adler32.c
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
||||||
|
* Copyright (C) 1995-2011, 2016 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
|
||||||
|
local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
|
||||||
|
|
||||||
|
#define BASE 65521U /* largest prime smaller than 65536 */
|
||||||
|
#define NMAX 5552
|
||||||
|
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
||||||
|
|
||||||
|
#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
|
||||||
|
#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
|
||||||
|
#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
|
||||||
|
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
|
||||||
|
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
||||||
|
|
||||||
|
/* use NO_DIVIDE if your processor does not do division in hardware --
|
||||||
|
try it both ways to see which is faster */
|
||||||
|
#ifdef NO_DIVIDE
|
||||||
|
/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
|
||||||
|
(thank you to John Reiser for pointing this out) */
|
||||||
|
# define CHOP(a) \
|
||||||
|
do { \
|
||||||
|
unsigned long tmp = a >> 16; \
|
||||||
|
a &= 0xffffUL; \
|
||||||
|
a += (tmp << 4) - tmp; \
|
||||||
|
} while (0)
|
||||||
|
# define MOD28(a) \
|
||||||
|
do { \
|
||||||
|
CHOP(a); \
|
||||||
|
if (a >= BASE) a -= BASE; \
|
||||||
|
} while (0)
|
||||||
|
# define MOD(a) \
|
||||||
|
do { \
|
||||||
|
CHOP(a); \
|
||||||
|
MOD28(a); \
|
||||||
|
} while (0)
|
||||||
|
# define MOD63(a) \
|
||||||
|
do { /* this assumes a is not negative */ \
|
||||||
|
z_off64_t tmp = a >> 32; \
|
||||||
|
a &= 0xffffffffL; \
|
||||||
|
a += (tmp << 8) - (tmp << 5) + tmp; \
|
||||||
|
tmp = a >> 16; \
|
||||||
|
a &= 0xffffL; \
|
||||||
|
a += (tmp << 4) - tmp; \
|
||||||
|
tmp = a >> 16; \
|
||||||
|
a &= 0xffffL; \
|
||||||
|
a += (tmp << 4) - tmp; \
|
||||||
|
if (a >= BASE) a -= BASE; \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
# define MOD(a) a %= BASE
|
||||||
|
# define MOD28(a) a %= BASE
|
||||||
|
# define MOD63(a) a %= BASE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
uLong ZEXPORT adler32_z(adler, buf, len)
|
||||||
|
uLong adler;
|
||||||
|
const Bytef *buf;
|
||||||
|
z_size_t len;
|
||||||
|
{
|
||||||
|
unsigned long sum2;
|
||||||
|
unsigned n;
|
||||||
|
|
||||||
|
/* split Adler-32 into component sums */
|
||||||
|
sum2 = (adler >> 16) & 0xffff;
|
||||||
|
adler &= 0xffff;
|
||||||
|
|
||||||
|
/* in case user likes doing a byte at a time, keep it fast */
|
||||||
|
if (len == 1) {
|
||||||
|
adler += buf[0];
|
||||||
|
if (adler >= BASE)
|
||||||
|
adler -= BASE;
|
||||||
|
sum2 += adler;
|
||||||
|
if (sum2 >= BASE)
|
||||||
|
sum2 -= BASE;
|
||||||
|
return adler | (sum2 << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initial Adler-32 value (deferred check for len == 1 speed) */
|
||||||
|
if (buf == Z_NULL)
|
||||||
|
return 1L;
|
||||||
|
|
||||||
|
/* in case short lengths are provided, keep it somewhat fast */
|
||||||
|
if (len < 16) {
|
||||||
|
while (len--) {
|
||||||
|
adler += *buf++;
|
||||||
|
sum2 += adler;
|
||||||
|
}
|
||||||
|
if (adler >= BASE)
|
||||||
|
adler -= BASE;
|
||||||
|
MOD28(sum2); /* only added so many BASE's */
|
||||||
|
return adler | (sum2 << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do length NMAX blocks -- requires just one modulo operation */
|
||||||
|
while (len >= NMAX) {
|
||||||
|
len -= NMAX;
|
||||||
|
n = NMAX / 16; /* NMAX is divisible by 16 */
|
||||||
|
do {
|
||||||
|
DO16(buf); /* 16 sums unrolled */
|
||||||
|
buf += 16;
|
||||||
|
} while (--n);
|
||||||
|
MOD(adler);
|
||||||
|
MOD(sum2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* do remaining bytes (less than NMAX, still just one modulo) */
|
||||||
|
if (len) { /* avoid modulos if none remaining */
|
||||||
|
while (len >= 16) {
|
||||||
|
len -= 16;
|
||||||
|
DO16(buf);
|
||||||
|
buf += 16;
|
||||||
|
}
|
||||||
|
while (len--) {
|
||||||
|
adler += *buf++;
|
||||||
|
sum2 += adler;
|
||||||
|
}
|
||||||
|
MOD(adler);
|
||||||
|
MOD(sum2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return recombined sums */
|
||||||
|
return adler | (sum2 << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
uLong ZEXPORT adler32(adler, buf, len)
|
||||||
|
uLong adler;
|
||||||
|
const Bytef *buf;
|
||||||
|
uInt len;
|
||||||
|
{
|
||||||
|
return adler32_z(adler, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local uLong adler32_combine_(adler1, adler2, len2)
|
||||||
|
uLong adler1;
|
||||||
|
uLong adler2;
|
||||||
|
z_off64_t len2;
|
||||||
|
{
|
||||||
|
unsigned long sum1;
|
||||||
|
unsigned long sum2;
|
||||||
|
unsigned rem;
|
||||||
|
|
||||||
|
/* for negative len, return invalid adler32 as a clue for debugging */
|
||||||
|
if (len2 < 0)
|
||||||
|
return 0xffffffffUL;
|
||||||
|
|
||||||
|
/* the derivation of this formula is left as an exercise for the reader */
|
||||||
|
MOD63(len2); /* assumes len2 >= 0 */
|
||||||
|
rem = (unsigned)len2;
|
||||||
|
sum1 = adler1 & 0xffff;
|
||||||
|
sum2 = rem * sum1;
|
||||||
|
MOD(sum2);
|
||||||
|
sum1 += (adler2 & 0xffff) + BASE - 1;
|
||||||
|
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
|
||||||
|
if (sum1 >= BASE) sum1 -= BASE;
|
||||||
|
if (sum1 >= BASE) sum1 -= BASE;
|
||||||
|
if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
|
||||||
|
if (sum2 >= BASE) sum2 -= BASE;
|
||||||
|
return sum1 | (sum2 << 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
uLong ZEXPORT adler32_combine(adler1, adler2, len2)
|
||||||
|
uLong adler1;
|
||||||
|
uLong adler2;
|
||||||
|
z_off_t len2;
|
||||||
|
{
|
||||||
|
return adler32_combine_(adler1, adler2, len2);
|
||||||
|
}
|
||||||
|
|
||||||
|
uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
|
||||||
|
uLong adler1;
|
||||||
|
uLong adler2;
|
||||||
|
z_off64_t len2;
|
||||||
|
{
|
||||||
|
return adler32_combine_(adler1, adler2, len2);
|
||||||
|
}
|
86
PdbChecker/zlib/compress.c
Normal file
86
PdbChecker/zlib/compress.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* compress.c -- compress a memory buffer
|
||||||
|
* Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#define ZLIB_INTERNAL
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Compresses the source buffer into the destination buffer. The level
|
||||||
|
parameter has the same meaning as in deflateInit. sourceLen is the byte
|
||||||
|
length of the source buffer. Upon entry, destLen is the total size of the
|
||||||
|
destination buffer, which must be at least 0.1% larger than sourceLen plus
|
||||||
|
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
|
||||||
|
|
||||||
|
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
|
||||||
|
Z_STREAM_ERROR if the level parameter is invalid.
|
||||||
|
*/
|
||||||
|
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong sourceLen;
|
||||||
|
int level;
|
||||||
|
{
|
||||||
|
z_stream stream;
|
||||||
|
int err;
|
||||||
|
const uInt max = (uInt)-1;
|
||||||
|
uLong left;
|
||||||
|
|
||||||
|
left = *destLen;
|
||||||
|
*destLen = 0;
|
||||||
|
|
||||||
|
stream.zalloc = (alloc_func)0;
|
||||||
|
stream.zfree = (free_func)0;
|
||||||
|
stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
|
err = deflateInit(&stream, level);
|
||||||
|
if (err != Z_OK) return err;
|
||||||
|
|
||||||
|
stream.next_out = dest;
|
||||||
|
stream.avail_out = 0;
|
||||||
|
stream.next_in = (z_const Bytef *)source;
|
||||||
|
stream.avail_in = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (stream.avail_out == 0) {
|
||||||
|
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
||||||
|
left -= stream.avail_out;
|
||||||
|
}
|
||||||
|
if (stream.avail_in == 0) {
|
||||||
|
stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
|
||||||
|
sourceLen -= stream.avail_in;
|
||||||
|
}
|
||||||
|
err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
|
||||||
|
} while (err == Z_OK);
|
||||||
|
|
||||||
|
*destLen = stream.total_out;
|
||||||
|
deflateEnd(&stream);
|
||||||
|
return err == Z_STREAM_END ? Z_OK : err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
*/
|
||||||
|
int ZEXPORT compress (dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong sourceLen;
|
||||||
|
{
|
||||||
|
return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
If the default memLevel or windowBits for deflateInit() is changed, then
|
||||||
|
this function needs to be updated.
|
||||||
|
*/
|
||||||
|
uLong ZEXPORT compressBound (sourceLen)
|
||||||
|
uLong sourceLen;
|
||||||
|
{
|
||||||
|
return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
|
||||||
|
(sourceLen >> 25) + 13;
|
||||||
|
}
|
442
PdbChecker/zlib/crc32.c
Normal file
442
PdbChecker/zlib/crc32.c
Normal file
@ -0,0 +1,442 @@
|
|||||||
|
/* crc32.c -- compute the CRC-32 of a data stream
|
||||||
|
* Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*
|
||||||
|
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
|
||||||
|
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
|
||||||
|
* tables for updating the shift register in one step with three exclusive-ors
|
||||||
|
* instead of four steps with four exclusive-ors. This results in about a
|
||||||
|
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
|
||||||
|
protection on the static variables used to control the first-use generation
|
||||||
|
of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
|
||||||
|
first call get_crc_table() to initialize the tables before allowing more than
|
||||||
|
one thread to use crc32().
|
||||||
|
|
||||||
|
DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef MAKECRCH
|
||||||
|
# include <stdio.h>
|
||||||
|
# ifndef DYNAMIC_CRC_TABLE
|
||||||
|
# define DYNAMIC_CRC_TABLE
|
||||||
|
# endif /* !DYNAMIC_CRC_TABLE */
|
||||||
|
#endif /* MAKECRCH */
|
||||||
|
|
||||||
|
#include "zutil.h" /* for STDC and FAR definitions */
|
||||||
|
|
||||||
|
/* Definitions for doing the crc four data bytes at a time. */
|
||||||
|
#if !defined(NOBYFOUR) && defined(Z_U4)
|
||||||
|
# define BYFOUR
|
||||||
|
#endif
|
||||||
|
#ifdef BYFOUR
|
||||||
|
local unsigned long crc32_little OF((unsigned long,
|
||||||
|
const unsigned char FAR *, z_size_t));
|
||||||
|
local unsigned long crc32_big OF((unsigned long,
|
||||||
|
const unsigned char FAR *, z_size_t));
|
||||||
|
# define TBLS 8
|
||||||
|
#else
|
||||||
|
# define TBLS 1
|
||||||
|
#endif /* BYFOUR */
|
||||||
|
|
||||||
|
/* Local functions for crc concatenation */
|
||||||
|
local unsigned long gf2_matrix_times OF((unsigned long *mat,
|
||||||
|
unsigned long vec));
|
||||||
|
local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
|
||||||
|
local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
|
||||||
|
local volatile int crc_table_empty = 1;
|
||||||
|
local z_crc_t FAR crc_table[TBLS][256];
|
||||||
|
local void make_crc_table OF((void));
|
||||||
|
#ifdef MAKECRCH
|
||||||
|
local void write_table OF((FILE *, const z_crc_t FAR *));
|
||||||
|
#endif /* MAKECRCH */
|
||||||
|
/*
|
||||||
|
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
|
||||||
|
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
||||||
|
|
||||||
|
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
||||||
|
with the lowest powers in the most significant bit. Then adding polynomials
|
||||||
|
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
||||||
|
one. If we call the above polynomial p, and represent a byte as the
|
||||||
|
polynomial q, also with the lowest power in the most significant bit (so the
|
||||||
|
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
||||||
|
where a mod b means the remainder after dividing a by b.
|
||||||
|
|
||||||
|
This calculation is done using the shift-register method of multiplying and
|
||||||
|
taking the remainder. The register is initialized to zero, and for each
|
||||||
|
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
||||||
|
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
||||||
|
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
||||||
|
out is a one). We start with the highest power (least significant bit) of
|
||||||
|
q and repeat for all eight bits of q.
|
||||||
|
|
||||||
|
The first table is simply the CRC of all possible eight bit values. This is
|
||||||
|
all the information needed to generate CRCs on data a byte at a time for all
|
||||||
|
combinations of CRC register values and incoming bytes. The remaining tables
|
||||||
|
allow for word-at-a-time CRC calculation for both big-endian and little-
|
||||||
|
endian machines, where a word is four bytes.
|
||||||
|
*/
|
||||||
|
local void make_crc_table()
|
||||||
|
{
|
||||||
|
z_crc_t c;
|
||||||
|
int n, k;
|
||||||
|
z_crc_t poly; /* polynomial exclusive-or pattern */
|
||||||
|
/* terms of polynomial defining this crc (except x^32): */
|
||||||
|
static volatile int first = 1; /* flag to limit concurrent making */
|
||||||
|
static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
||||||
|
|
||||||
|
/* See if another task is already doing this (not thread-safe, but better
|
||||||
|
than nothing -- significantly reduces duration of vulnerability in
|
||||||
|
case the advice about DYNAMIC_CRC_TABLE is ignored) */
|
||||||
|
if (first) {
|
||||||
|
first = 0;
|
||||||
|
|
||||||
|
/* make exclusive-or pattern from polynomial (0xedb88320UL) */
|
||||||
|
poly = 0;
|
||||||
|
for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
|
||||||
|
poly |= (z_crc_t)1 << (31 - p[n]);
|
||||||
|
|
||||||
|
/* generate a crc for every 8-bit value */
|
||||||
|
for (n = 0; n < 256; n++) {
|
||||||
|
c = (z_crc_t)n;
|
||||||
|
for (k = 0; k < 8; k++)
|
||||||
|
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
|
||||||
|
crc_table[0][n] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BYFOUR
|
||||||
|
/* generate crc for each value followed by one, two, and three zeros,
|
||||||
|
and then the byte reversal of those as well as the first table */
|
||||||
|
for (n = 0; n < 256; n++) {
|
||||||
|
c = crc_table[0][n];
|
||||||
|
crc_table[4][n] = ZSWAP32(c);
|
||||||
|
for (k = 1; k < 4; k++) {
|
||||||
|
c = crc_table[0][c & 0xff] ^ (c >> 8);
|
||||||
|
crc_table[k][n] = c;
|
||||||
|
crc_table[k + 4][n] = ZSWAP32(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* BYFOUR */
|
||||||
|
|
||||||
|
crc_table_empty = 0;
|
||||||
|
}
|
||||||
|
else { /* not first */
|
||||||
|
/* wait for the other guy to finish (not efficient, but rare) */
|
||||||
|
while (crc_table_empty)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MAKECRCH
|
||||||
|
/* write out CRC tables to crc32.h */
|
||||||
|
{
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
out = fopen("crc32.h", "w");
|
||||||
|
if (out == NULL) return;
|
||||||
|
fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
|
||||||
|
fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
|
||||||
|
fprintf(out, "local const z_crc_t FAR ");
|
||||||
|
fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
|
||||||
|
write_table(out, crc_table[0]);
|
||||||
|
# ifdef BYFOUR
|
||||||
|
fprintf(out, "#ifdef BYFOUR\n");
|
||||||
|
for (k = 1; k < 8; k++) {
|
||||||
|
fprintf(out, " },\n {\n");
|
||||||
|
write_table(out, crc_table[k]);
|
||||||
|
}
|
||||||
|
fprintf(out, "#endif\n");
|
||||||
|
# endif /* BYFOUR */
|
||||||
|
fprintf(out, " }\n};\n");
|
||||||
|
fclose(out);
|
||||||
|
}
|
||||||
|
#endif /* MAKECRCH */
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MAKECRCH
|
||||||
|
local void write_table(out, table)
|
||||||
|
FILE *out;
|
||||||
|
const z_crc_t FAR *table;
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = 0; n < 256; n++)
|
||||||
|
fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
|
||||||
|
(unsigned long)(table[n]),
|
||||||
|
n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
|
||||||
|
}
|
||||||
|
#endif /* MAKECRCH */
|
||||||
|
|
||||||
|
#else /* !DYNAMIC_CRC_TABLE */
|
||||||
|
/* ========================================================================
|
||||||
|
* Tables of CRC-32s of all single-byte values, made by make_crc_table().
|
||||||
|
*/
|
||||||
|
#include "crc32.h"
|
||||||
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
|
||||||
|
/* =========================================================================
|
||||||
|
* This function can be used by asm versions of crc32()
|
||||||
|
*/
|
||||||
|
const z_crc_t FAR * ZEXPORT get_crc_table()
|
||||||
|
{
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
if (crc_table_empty)
|
||||||
|
make_crc_table();
|
||||||
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
return (const z_crc_t FAR *)crc_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
|
||||||
|
#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
unsigned long ZEXPORT crc32_z(crc, buf, len)
|
||||||
|
unsigned long crc;
|
||||||
|
const unsigned char FAR *buf;
|
||||||
|
z_size_t len;
|
||||||
|
{
|
||||||
|
if (buf == Z_NULL) return 0UL;
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
if (crc_table_empty)
|
||||||
|
make_crc_table();
|
||||||
|
#endif /* DYNAMIC_CRC_TABLE */
|
||||||
|
|
||||||
|
#ifdef BYFOUR
|
||||||
|
if (sizeof(void *) == sizeof(ptrdiff_t)) {
|
||||||
|
z_crc_t endian;
|
||||||
|
|
||||||
|
endian = 1;
|
||||||
|
if (*((unsigned char *)(&endian)))
|
||||||
|
return crc32_little(crc, buf, len);
|
||||||
|
else
|
||||||
|
return crc32_big(crc, buf, len);
|
||||||
|
}
|
||||||
|
#endif /* BYFOUR */
|
||||||
|
crc = crc ^ 0xffffffffUL;
|
||||||
|
while (len >= 8) {
|
||||||
|
DO8;
|
||||||
|
len -= 8;
|
||||||
|
}
|
||||||
|
if (len) do {
|
||||||
|
DO1;
|
||||||
|
} while (--len);
|
||||||
|
return crc ^ 0xffffffffUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
unsigned long ZEXPORT crc32(crc, buf, len)
|
||||||
|
unsigned long crc;
|
||||||
|
const unsigned char FAR *buf;
|
||||||
|
uInt len;
|
||||||
|
{
|
||||||
|
return crc32_z(crc, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BYFOUR
|
||||||
|
|
||||||
|
/*
|
||||||
|
This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit
|
||||||
|
integer pointer type. This violates the strict aliasing rule, where a
|
||||||
|
compiler can assume, for optimization purposes, that two pointers to
|
||||||
|
fundamentally different types won't ever point to the same memory. This can
|
||||||
|
manifest as a problem only if one of the pointers is written to. This code
|
||||||
|
only reads from those pointers. So long as this code remains isolated in
|
||||||
|
this compilation unit, there won't be a problem. For this reason, this code
|
||||||
|
should not be copied and pasted into a compilation unit in which other code
|
||||||
|
writes to the buffer that is passed to these routines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
#define DOLIT4 c ^= *buf4++; \
|
||||||
|
c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
|
||||||
|
crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
|
||||||
|
#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local unsigned long crc32_little(crc, buf, len)
|
||||||
|
unsigned long crc;
|
||||||
|
const unsigned char FAR *buf;
|
||||||
|
z_size_t len;
|
||||||
|
{
|
||||||
|
register z_crc_t c;
|
||||||
|
register const z_crc_t FAR *buf4;
|
||||||
|
|
||||||
|
c = (z_crc_t)crc;
|
||||||
|
c = ~c;
|
||||||
|
while (len && ((ptrdiff_t)buf & 3)) {
|
||||||
|
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
|
||||||
|
while (len >= 32) {
|
||||||
|
DOLIT32;
|
||||||
|
len -= 32;
|
||||||
|
}
|
||||||
|
while (len >= 4) {
|
||||||
|
DOLIT4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
buf = (const unsigned char FAR *)buf4;
|
||||||
|
|
||||||
|
if (len) do {
|
||||||
|
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
|
||||||
|
} while (--len);
|
||||||
|
c = ~c;
|
||||||
|
return (unsigned long)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
#define DOBIG4 c ^= *buf4++; \
|
||||||
|
c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
|
||||||
|
crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
|
||||||
|
#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local unsigned long crc32_big(crc, buf, len)
|
||||||
|
unsigned long crc;
|
||||||
|
const unsigned char FAR *buf;
|
||||||
|
z_size_t len;
|
||||||
|
{
|
||||||
|
register z_crc_t c;
|
||||||
|
register const z_crc_t FAR *buf4;
|
||||||
|
|
||||||
|
c = ZSWAP32((z_crc_t)crc);
|
||||||
|
c = ~c;
|
||||||
|
while (len && ((ptrdiff_t)buf & 3)) {
|
||||||
|
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
|
||||||
|
while (len >= 32) {
|
||||||
|
DOBIG32;
|
||||||
|
len -= 32;
|
||||||
|
}
|
||||||
|
while (len >= 4) {
|
||||||
|
DOBIG4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
buf = (const unsigned char FAR *)buf4;
|
||||||
|
|
||||||
|
if (len) do {
|
||||||
|
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
|
||||||
|
} while (--len);
|
||||||
|
c = ~c;
|
||||||
|
return (unsigned long)(ZSWAP32(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BYFOUR */
|
||||||
|
|
||||||
|
#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local unsigned long gf2_matrix_times(mat, vec)
|
||||||
|
unsigned long *mat;
|
||||||
|
unsigned long vec;
|
||||||
|
{
|
||||||
|
unsigned long sum;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
while (vec) {
|
||||||
|
if (vec & 1)
|
||||||
|
sum ^= *mat;
|
||||||
|
vec >>= 1;
|
||||||
|
mat++;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local void gf2_matrix_square(square, mat)
|
||||||
|
unsigned long *square;
|
||||||
|
unsigned long *mat;
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = 0; n < GF2_DIM; n++)
|
||||||
|
square[n] = gf2_matrix_times(mat, mat[n]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
local uLong crc32_combine_(crc1, crc2, len2)
|
||||||
|
uLong crc1;
|
||||||
|
uLong crc2;
|
||||||
|
z_off64_t len2;
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
unsigned long row;
|
||||||
|
unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
|
||||||
|
unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
|
||||||
|
|
||||||
|
/* degenerate case (also disallow negative lengths) */
|
||||||
|
if (len2 <= 0)
|
||||||
|
return crc1;
|
||||||
|
|
||||||
|
/* put operator for one zero bit in odd */
|
||||||
|
odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
|
||||||
|
row = 1;
|
||||||
|
for (n = 1; n < GF2_DIM; n++) {
|
||||||
|
odd[n] = row;
|
||||||
|
row <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put operator for two zero bits in even */
|
||||||
|
gf2_matrix_square(even, odd);
|
||||||
|
|
||||||
|
/* put operator for four zero bits in odd */
|
||||||
|
gf2_matrix_square(odd, even);
|
||||||
|
|
||||||
|
/* apply len2 zeros to crc1 (first square will put the operator for one
|
||||||
|
zero byte, eight zero bits, in even) */
|
||||||
|
do {
|
||||||
|
/* apply zeros operator for this bit of len2 */
|
||||||
|
gf2_matrix_square(even, odd);
|
||||||
|
if (len2 & 1)
|
||||||
|
crc1 = gf2_matrix_times(even, crc1);
|
||||||
|
len2 >>= 1;
|
||||||
|
|
||||||
|
/* if no more bits set, then done */
|
||||||
|
if (len2 == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* another iteration of the loop with odd and even swapped */
|
||||||
|
gf2_matrix_square(odd, even);
|
||||||
|
if (len2 & 1)
|
||||||
|
crc1 = gf2_matrix_times(odd, crc1);
|
||||||
|
len2 >>= 1;
|
||||||
|
|
||||||
|
/* if no more bits set, then done */
|
||||||
|
} while (len2 != 0);
|
||||||
|
|
||||||
|
/* return combined crc */
|
||||||
|
crc1 ^= crc2;
|
||||||
|
return crc1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================================= */
|
||||||
|
uLong ZEXPORT crc32_combine(crc1, crc2, len2)
|
||||||
|
uLong crc1;
|
||||||
|
uLong crc2;
|
||||||
|
z_off_t len2;
|
||||||
|
{
|
||||||
|
return crc32_combine_(crc1, crc2, (z_off64_t)len2);
|
||||||
|
}
|
||||||
|
|
||||||
|
uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
|
||||||
|
uLong crc1;
|
||||||
|
uLong crc2;
|
||||||
|
z_off64_t len2;
|
||||||
|
{
|
||||||
|
return crc32_combine_(crc1, crc2, len2);
|
||||||
|
}
|
441
PdbChecker/zlib/crc32.h
Normal file
441
PdbChecker/zlib/crc32.h
Normal file
@ -0,0 +1,441 @@
|
|||||||
|
/* crc32.h -- tables for rapid CRC calculation
|
||||||
|
* Generated automatically by crc32.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
local const z_crc_t FAR crc_table[TBLS][256] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
|
||||||
|
0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
|
||||||
|
0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
|
||||||
|
0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
|
||||||
|
0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
|
||||||
|
0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
|
||||||
|
0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
|
||||||
|
0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
|
||||||
|
0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
|
||||||
|
0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
|
||||||
|
0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
|
||||||
|
0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
|
||||||
|
0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
|
||||||
|
0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
|
||||||
|
0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
|
||||||
|
0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
|
||||||
|
0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
|
||||||
|
0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
|
||||||
|
0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
|
||||||
|
0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
|
||||||
|
0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
|
||||||
|
0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
|
||||||
|
0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
|
||||||
|
0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
|
||||||
|
0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
|
||||||
|
0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
|
||||||
|
0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
|
||||||
|
0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
|
||||||
|
0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
|
||||||
|
0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
|
||||||
|
0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
|
||||||
|
0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
|
||||||
|
0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
|
||||||
|
0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
|
||||||
|
0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
|
||||||
|
0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
|
||||||
|
0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
|
||||||
|
0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
|
||||||
|
0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
|
||||||
|
0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
|
||||||
|
0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
|
||||||
|
0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
|
||||||
|
0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
|
||||||
|
0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
|
||||||
|
0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
|
||||||
|
0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
|
||||||
|
0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
|
||||||
|
0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
|
||||||
|
0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
|
||||||
|
0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
|
||||||
|
0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
|
||||||
|
0x2d02ef8dUL
|
||||||
|
#ifdef BYFOUR
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
|
||||||
|
0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
|
||||||
|
0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
|
||||||
|
0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
|
||||||
|
0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
|
||||||
|
0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
|
||||||
|
0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
|
||||||
|
0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
|
||||||
|
0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
|
||||||
|
0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
|
||||||
|
0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
|
||||||
|
0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
|
||||||
|
0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
|
||||||
|
0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
|
||||||
|
0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
|
||||||
|
0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
|
||||||
|
0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
|
||||||
|
0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
|
||||||
|
0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
|
||||||
|
0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
|
||||||
|
0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
|
||||||
|
0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
|
||||||
|
0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
|
||||||
|
0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
|
||||||
|
0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
|
||||||
|
0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
|
||||||
|
0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
|
||||||
|
0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
|
||||||
|
0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
|
||||||
|
0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
|
||||||
|
0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
|
||||||
|
0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
|
||||||
|
0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
|
||||||
|
0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
|
||||||
|
0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
|
||||||
|
0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
|
||||||
|
0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
|
||||||
|
0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
|
||||||
|
0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
|
||||||
|
0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
|
||||||
|
0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
|
||||||
|
0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
|
||||||
|
0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
|
||||||
|
0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
|
||||||
|
0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
|
||||||
|
0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
|
||||||
|
0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
|
||||||
|
0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
|
||||||
|
0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
|
||||||
|
0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
|
||||||
|
0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
|
||||||
|
0x9324fd72UL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
|
||||||
|
0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
|
||||||
|
0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
|
||||||
|
0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
|
||||||
|
0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
|
||||||
|
0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
|
||||||
|
0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
|
||||||
|
0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
|
||||||
|
0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
|
||||||
|
0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
|
||||||
|
0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
|
||||||
|
0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
|
||||||
|
0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
|
||||||
|
0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
|
||||||
|
0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
|
||||||
|
0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
|
||||||
|
0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
|
||||||
|
0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
|
||||||
|
0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
|
||||||
|
0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
|
||||||
|
0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
|
||||||
|
0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
|
||||||
|
0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
|
||||||
|
0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
|
||||||
|
0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
|
||||||
|
0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
|
||||||
|
0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
|
||||||
|
0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
|
||||||
|
0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
|
||||||
|
0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
|
||||||
|
0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
|
||||||
|
0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
|
||||||
|
0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
|
||||||
|
0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
|
||||||
|
0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
|
||||||
|
0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
|
||||||
|
0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
|
||||||
|
0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
|
||||||
|
0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
|
||||||
|
0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
|
||||||
|
0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
|
||||||
|
0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
|
||||||
|
0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
|
||||||
|
0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
|
||||||
|
0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
|
||||||
|
0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
|
||||||
|
0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
|
||||||
|
0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
|
||||||
|
0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
|
||||||
|
0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
|
||||||
|
0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
|
||||||
|
0xbe9834edUL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
|
||||||
|
0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
|
||||||
|
0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
|
||||||
|
0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
|
||||||
|
0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
|
||||||
|
0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
|
||||||
|
0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
|
||||||
|
0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
|
||||||
|
0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
|
||||||
|
0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
|
||||||
|
0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
|
||||||
|
0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
|
||||||
|
0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
|
||||||
|
0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
|
||||||
|
0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
|
||||||
|
0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
|
||||||
|
0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
|
||||||
|
0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
|
||||||
|
0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
|
||||||
|
0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
|
||||||
|
0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
|
||||||
|
0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
|
||||||
|
0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
|
||||||
|
0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
|
||||||
|
0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
|
||||||
|
0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
|
||||||
|
0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
|
||||||
|
0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
|
||||||
|
0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
|
||||||
|
0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
|
||||||
|
0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
|
||||||
|
0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
|
||||||
|
0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
|
||||||
|
0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
|
||||||
|
0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
|
||||||
|
0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
|
||||||
|
0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
|
||||||
|
0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
|
||||||
|
0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
|
||||||
|
0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
|
||||||
|
0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
|
||||||
|
0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
|
||||||
|
0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
|
||||||
|
0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
|
||||||
|
0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
|
||||||
|
0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
|
||||||
|
0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
|
||||||
|
0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
|
||||||
|
0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
|
||||||
|
0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
|
||||||
|
0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
|
||||||
|
0xde0506f1UL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
|
||||||
|
0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
|
||||||
|
0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
|
||||||
|
0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
|
||||||
|
0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
|
||||||
|
0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
|
||||||
|
0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
|
||||||
|
0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
|
||||||
|
0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
|
||||||
|
0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
|
||||||
|
0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
|
||||||
|
0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
|
||||||
|
0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
|
||||||
|
0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
|
||||||
|
0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
|
||||||
|
0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
|
||||||
|
0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
|
||||||
|
0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
|
||||||
|
0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
|
||||||
|
0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
|
||||||
|
0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
|
||||||
|
0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
|
||||||
|
0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
|
||||||
|
0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
|
||||||
|
0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
|
||||||
|
0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
|
||||||
|
0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
|
||||||
|
0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
|
||||||
|
0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
|
||||||
|
0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
|
||||||
|
0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
|
||||||
|
0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
|
||||||
|
0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
|
||||||
|
0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
|
||||||
|
0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
|
||||||
|
0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
|
||||||
|
0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
|
||||||
|
0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
|
||||||
|
0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
|
||||||
|
0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
|
||||||
|
0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
|
||||||
|
0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
|
||||||
|
0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
|
||||||
|
0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
|
||||||
|
0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
|
||||||
|
0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
|
||||||
|
0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
|
||||||
|
0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
|
||||||
|
0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
|
||||||
|
0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
|
||||||
|
0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
|
||||||
|
0x8def022dUL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
|
||||||
|
0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
|
||||||
|
0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
|
||||||
|
0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
|
||||||
|
0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
|
||||||
|
0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
|
||||||
|
0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
|
||||||
|
0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
|
||||||
|
0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
|
||||||
|
0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
|
||||||
|
0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
|
||||||
|
0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
|
||||||
|
0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
|
||||||
|
0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
|
||||||
|
0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
|
||||||
|
0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
|
||||||
|
0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
|
||||||
|
0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
|
||||||
|
0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
|
||||||
|
0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
|
||||||
|
0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
|
||||||
|
0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
|
||||||
|
0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
|
||||||
|
0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
|
||||||
|
0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
|
||||||
|
0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
|
||||||
|
0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
|
||||||
|
0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
|
||||||
|
0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
|
||||||
|
0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
|
||||||
|
0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
|
||||||
|
0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
|
||||||
|
0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
|
||||||
|
0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
|
||||||
|
0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
|
||||||
|
0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
|
||||||
|
0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
|
||||||
|
0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
|
||||||
|
0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
|
||||||
|
0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
|
||||||
|
0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
|
||||||
|
0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
|
||||||
|
0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
|
||||||
|
0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
|
||||||
|
0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
|
||||||
|
0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
|
||||||
|
0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
|
||||||
|
0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
|
||||||
|
0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
|
||||||
|
0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
|
||||||
|
0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
|
||||||
|
0x72fd2493UL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
|
||||||
|
0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
|
||||||
|
0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
|
||||||
|
0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
|
||||||
|
0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
|
||||||
|
0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
|
||||||
|
0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
|
||||||
|
0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
|
||||||
|
0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
|
||||||
|
0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
|
||||||
|
0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
|
||||||
|
0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
|
||||||
|
0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
|
||||||
|
0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
|
||||||
|
0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
|
||||||
|
0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
|
||||||
|
0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
|
||||||
|
0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
|
||||||
|
0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
|
||||||
|
0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
|
||||||
|
0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
|
||||||
|
0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
|
||||||
|
0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
|
||||||
|
0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
|
||||||
|
0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
|
||||||
|
0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
|
||||||
|
0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
|
||||||
|
0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
|
||||||
|
0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
|
||||||
|
0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
|
||||||
|
0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
|
||||||
|
0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
|
||||||
|
0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
|
||||||
|
0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
|
||||||
|
0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
|
||||||
|
0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
|
||||||
|
0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
|
||||||
|
0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
|
||||||
|
0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
|
||||||
|
0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
|
||||||
|
0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
|
||||||
|
0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
|
||||||
|
0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
|
||||||
|
0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
|
||||||
|
0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
|
||||||
|
0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
|
||||||
|
0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
|
||||||
|
0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
|
||||||
|
0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
|
||||||
|
0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
|
||||||
|
0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
|
||||||
|
0xed3498beUL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
|
||||||
|
0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
|
||||||
|
0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
|
||||||
|
0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
|
||||||
|
0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
|
||||||
|
0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
|
||||||
|
0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
|
||||||
|
0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
|
||||||
|
0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
|
||||||
|
0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
|
||||||
|
0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
|
||||||
|
0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
|
||||||
|
0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
|
||||||
|
0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
|
||||||
|
0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
|
||||||
|
0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
|
||||||
|
0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
|
||||||
|
0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
|
||||||
|
0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
|
||||||
|
0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
|
||||||
|
0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
|
||||||
|
0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
|
||||||
|
0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
|
||||||
|
0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
|
||||||
|
0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
|
||||||
|
0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
|
||||||
|
0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
|
||||||
|
0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
|
||||||
|
0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
|
||||||
|
0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
|
||||||
|
0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
|
||||||
|
0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
|
||||||
|
0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
|
||||||
|
0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
|
||||||
|
0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
|
||||||
|
0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
|
||||||
|
0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
|
||||||
|
0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
|
||||||
|
0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
|
||||||
|
0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
|
||||||
|
0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
|
||||||
|
0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
|
||||||
|
0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
|
||||||
|
0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
|
||||||
|
0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
|
||||||
|
0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
|
||||||
|
0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
|
||||||
|
0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
|
||||||
|
0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
|
||||||
|
0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
|
||||||
|
0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
|
||||||
|
0xf10605deUL
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
2163
PdbChecker/zlib/deflate.c
Normal file
2163
PdbChecker/zlib/deflate.c
Normal file
File diff suppressed because it is too large
Load Diff
349
PdbChecker/zlib/deflate.h
Normal file
349
PdbChecker/zlib/deflate.h
Normal file
@ -0,0 +1,349 @@
|
|||||||
|
/* deflate.h -- internal compression state
|
||||||
|
* Copyright (C) 1995-2016 Jean-loup Gailly
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef DEFLATE_H
|
||||||
|
#define DEFLATE_H
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
|
||||||
|
/* define NO_GZIP when compiling if you want to disable gzip header and
|
||||||
|
trailer creation by deflate(). NO_GZIP would be used to avoid linking in
|
||||||
|
the crc code when it is not needed. For shared libraries, gzip encoding
|
||||||
|
should be left enabled. */
|
||||||
|
#ifndef NO_GZIP
|
||||||
|
# define GZIP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
* Internal compression state.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LENGTH_CODES 29
|
||||||
|
/* number of length codes, not counting the special END_BLOCK code */
|
||||||
|
|
||||||
|
#define LITERALS 256
|
||||||
|
/* number of literal bytes 0..255 */
|
||||||
|
|
||||||
|
#define L_CODES (LITERALS+1+LENGTH_CODES)
|
||||||
|
/* number of Literal or Length codes, including the END_BLOCK code */
|
||||||
|
|
||||||
|
#define D_CODES 30
|
||||||
|
/* number of distance codes */
|
||||||
|
|
||||||
|
#define BL_CODES 19
|
||||||
|
/* number of codes used to transfer the bit lengths */
|
||||||
|
|
||||||
|
#define HEAP_SIZE (2*L_CODES+1)
|
||||||
|
/* maximum heap size */
|
||||||
|
|
||||||
|
#define MAX_BITS 15
|
||||||
|
/* All codes must not exceed MAX_BITS bits */
|
||||||
|
|
||||||
|
#define Buf_size 16
|
||||||
|
/* size of bit buffer in bi_buf */
|
||||||
|
|
||||||
|
#define INIT_STATE 42 /* zlib header -> BUSY_STATE */
|
||||||
|
#ifdef GZIP
|
||||||
|
# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */
|
||||||
|
#endif
|
||||||
|
#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */
|
||||||
|
#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */
|
||||||
|
#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */
|
||||||
|
#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */
|
||||||
|
#define BUSY_STATE 113 /* deflate -> FINISH_STATE */
|
||||||
|
#define FINISH_STATE 666 /* stream complete */
|
||||||
|
/* Stream status */
|
||||||
|
|
||||||
|
|
||||||
|
/* Data structure describing a single value and its code string. */
|
||||||
|
typedef struct ct_data_s {
|
||||||
|
union {
|
||||||
|
ush freq; /* frequency count */
|
||||||
|
ush code; /* bit string */
|
||||||
|
} fc;
|
||||||
|
union {
|
||||||
|
ush dad; /* father node in Huffman tree */
|
||||||
|
ush len; /* length of bit string */
|
||||||
|
} dl;
|
||||||
|
} FAR ct_data;
|
||||||
|
|
||||||
|
#define Freq fc.freq
|
||||||
|
#define Code fc.code
|
||||||
|
#define Dad dl.dad
|
||||||
|
#define Len dl.len
|
||||||
|
|
||||||
|
typedef struct static_tree_desc_s static_tree_desc;
|
||||||
|
|
||||||
|
typedef struct tree_desc_s {
|
||||||
|
ct_data *dyn_tree; /* the dynamic tree */
|
||||||
|
int max_code; /* largest code with non zero frequency */
|
||||||
|
const static_tree_desc *stat_desc; /* the corresponding static tree */
|
||||||
|
} FAR tree_desc;
|
||||||
|
|
||||||
|
typedef ush Pos;
|
||||||
|
typedef Pos FAR Posf;
|
||||||
|
typedef unsigned IPos;
|
||||||
|
|
||||||
|
/* A Pos is an index in the character window. We use short instead of int to
|
||||||
|
* save space in the various tables. IPos is used only for parameter passing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct internal_state {
|
||||||
|
z_streamp strm; /* pointer back to this zlib stream */
|
||||||
|
int status; /* as the name implies */
|
||||||
|
Bytef *pending_buf; /* output still pending */
|
||||||
|
ulg pending_buf_size; /* size of pending_buf */
|
||||||
|
Bytef *pending_out; /* next pending byte to output to the stream */
|
||||||
|
ulg pending; /* nb of bytes in the pending buffer */
|
||||||
|
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
|
||||||
|
gz_headerp gzhead; /* gzip header information to write */
|
||||||
|
ulg gzindex; /* where in extra, name, or comment */
|
||||||
|
Byte method; /* can only be DEFLATED */
|
||||||
|
int last_flush; /* value of flush param for previous deflate call */
|
||||||
|
|
||||||
|
/* used by deflate.c: */
|
||||||
|
|
||||||
|
uInt w_size; /* LZ77 window size (32K by default) */
|
||||||
|
uInt w_bits; /* log2(w_size) (8..16) */
|
||||||
|
uInt w_mask; /* w_size - 1 */
|
||||||
|
|
||||||
|
Bytef *window;
|
||||||
|
/* Sliding window. Input bytes are read into the second half of the window,
|
||||||
|
* and move to the first half later to keep a dictionary of at least wSize
|
||||||
|
* bytes. With this organization, matches are limited to a distance of
|
||||||
|
* wSize-MAX_MATCH bytes, but this ensures that IO is always
|
||||||
|
* performed with a length multiple of the block size. Also, it limits
|
||||||
|
* the window size to 64K, which is quite useful on MSDOS.
|
||||||
|
* To do: use the user input buffer as sliding window.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ulg window_size;
|
||||||
|
/* Actual size of window: 2*wSize, except when the user input buffer
|
||||||
|
* is directly used as sliding window.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Posf *prev;
|
||||||
|
/* Link to older string with same hash index. To limit the size of this
|
||||||
|
* array to 64K, this link is maintained only for the last 32K strings.
|
||||||
|
* An index in this array is thus a window index modulo 32K.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Posf *head; /* Heads of the hash chains or NIL. */
|
||||||
|
|
||||||
|
uInt ins_h; /* hash index of string to be inserted */
|
||||||
|
uInt hash_size; /* number of elements in hash table */
|
||||||
|
uInt hash_bits; /* log2(hash_size) */
|
||||||
|
uInt hash_mask; /* hash_size-1 */
|
||||||
|
|
||||||
|
uInt hash_shift;
|
||||||
|
/* Number of bits by which ins_h must be shifted at each input
|
||||||
|
* step. It must be such that after MIN_MATCH steps, the oldest
|
||||||
|
* byte no longer takes part in the hash key, that is:
|
||||||
|
* hash_shift * MIN_MATCH >= hash_bits
|
||||||
|
*/
|
||||||
|
|
||||||
|
long block_start;
|
||||||
|
/* Window position at the beginning of the current output block. Gets
|
||||||
|
* negative when the window is moved backwards.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uInt match_length; /* length of best match */
|
||||||
|
IPos prev_match; /* previous match */
|
||||||
|
int match_available; /* set if previous match exists */
|
||||||
|
uInt strstart; /* start of string to insert */
|
||||||
|
uInt match_start; /* start of matching string */
|
||||||
|
uInt lookahead; /* number of valid bytes ahead in window */
|
||||||
|
|
||||||
|
uInt prev_length;
|
||||||
|
/* Length of the best match at previous step. Matches not greater than this
|
||||||
|
* are discarded. This is used in the lazy match evaluation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uInt max_chain_length;
|
||||||
|
/* To speed up deflation, hash chains are never searched beyond this
|
||||||
|
* length. A higher limit improves compression ratio but degrades the
|
||||||
|
* speed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uInt max_lazy_match;
|
||||||
|
/* Attempt to find a better match only when the current match is strictly
|
||||||
|
* smaller than this value. This mechanism is used only for compression
|
||||||
|
* levels >= 4.
|
||||||
|
*/
|
||||||
|
# define max_insert_length max_lazy_match
|
||||||
|
/* Insert new strings in the hash table only if the match length is not
|
||||||
|
* greater than this length. This saves time but degrades compression.
|
||||||
|
* max_insert_length is used only for compression levels <= 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int level; /* compression level (1..9) */
|
||||||
|
int strategy; /* favor or force Huffman coding*/
|
||||||
|
|
||||||
|
uInt good_match;
|
||||||
|
/* Use a faster search when the previous match is longer than this */
|
||||||
|
|
||||||
|
int nice_match; /* Stop searching when current match exceeds this */
|
||||||
|
|
||||||
|
/* used by trees.c: */
|
||||||
|
/* Didn't use ct_data typedef below to suppress compiler warning */
|
||||||
|
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
|
||||||
|
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
|
||||||
|
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
|
||||||
|
|
||||||
|
struct tree_desc_s l_desc; /* desc. for literal tree */
|
||||||
|
struct tree_desc_s d_desc; /* desc. for distance tree */
|
||||||
|
struct tree_desc_s bl_desc; /* desc. for bit length tree */
|
||||||
|
|
||||||
|
ush bl_count[MAX_BITS+1];
|
||||||
|
/* number of codes at each bit length for an optimal tree */
|
||||||
|
|
||||||
|
int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
|
||||||
|
int heap_len; /* number of elements in the heap */
|
||||||
|
int heap_max; /* element of largest frequency */
|
||||||
|
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
|
||||||
|
* The same heap array is used to build all trees.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uch depth[2*L_CODES+1];
|
||||||
|
/* Depth of each subtree used as tie breaker for trees of equal frequency
|
||||||
|
*/
|
||||||
|
|
||||||
|
uchf *l_buf; /* buffer for literals or lengths */
|
||||||
|
|
||||||
|
uInt lit_bufsize;
|
||||||
|
/* Size of match buffer for literals/lengths. There are 4 reasons for
|
||||||
|
* limiting lit_bufsize to 64K:
|
||||||
|
* - frequencies can be kept in 16 bit counters
|
||||||
|
* - if compression is not successful for the first block, all input
|
||||||
|
* data is still in the window so we can still emit a stored block even
|
||||||
|
* when input comes from standard input. (This can also be done for
|
||||||
|
* all blocks if lit_bufsize is not greater than 32K.)
|
||||||
|
* - if compression is not successful for a file smaller than 64K, we can
|
||||||
|
* even emit a stored file instead of a stored block (saving 5 bytes).
|
||||||
|
* This is applicable only for zip (not gzip or zlib).
|
||||||
|
* - creating new Huffman trees less frequently may not provide fast
|
||||||
|
* adaptation to changes in the input data statistics. (Take for
|
||||||
|
* example a binary file with poorly compressible code followed by
|
||||||
|
* a highly compressible string table.) Smaller buffer sizes give
|
||||||
|
* fast adaptation but have of course the overhead of transmitting
|
||||||
|
* trees more frequently.
|
||||||
|
* - I can't count above 4
|
||||||
|
*/
|
||||||
|
|
||||||
|
uInt last_lit; /* running index in l_buf */
|
||||||
|
|
||||||
|
ushf *d_buf;
|
||||||
|
/* Buffer for distances. To simplify the code, d_buf and l_buf have
|
||||||
|
* the same number of elements. To use different lengths, an extra flag
|
||||||
|
* array would be necessary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ulg opt_len; /* bit length of current block with optimal trees */
|
||||||
|
ulg static_len; /* bit length of current block with static trees */
|
||||||
|
uInt matches; /* number of string matches in current block */
|
||||||
|
uInt insert; /* bytes at end of window left to insert */
|
||||||
|
|
||||||
|
#ifdef ZLIB_DEBUG
|
||||||
|
ulg compressed_len; /* total bit length of compressed file mod 2^32 */
|
||||||
|
ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ush bi_buf;
|
||||||
|
/* Output buffer. bits are inserted starting at the bottom (least
|
||||||
|
* significant bits).
|
||||||
|
*/
|
||||||
|
int bi_valid;
|
||||||
|
/* Number of valid bits in bi_buf. All bits above the last valid bit
|
||||||
|
* are always zero.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ulg high_water;
|
||||||
|
/* High water mark offset in window for initialized bytes -- bytes above
|
||||||
|
* this are set to zero in order to avoid memory check warnings when
|
||||||
|
* longest match routines access bytes past the input. This is then
|
||||||
|
* updated to the new high water mark.
|
||||||
|
*/
|
||||||
|
|
||||||
|
} FAR deflate_state;
|
||||||
|
|
||||||
|
/* Output a byte on the stream.
|
||||||
|
* IN assertion: there is enough room in pending_buf.
|
||||||
|
*/
|
||||||
|
#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);}
|
||||||
|
|
||||||
|
|
||||||
|
#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
|
||||||
|
/* Minimum amount of lookahead, except at the end of the input file.
|
||||||
|
* See deflate.c for comments about the MIN_MATCH+1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
|
||||||
|
/* In order to simplify the code, particularly on 16 bit machines, match
|
||||||
|
* distances are limited to MAX_DIST instead of WSIZE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN_INIT MAX_MATCH
|
||||||
|
/* Number of bytes after end of data in window to initialize in order to avoid
|
||||||
|
memory checker errors from longest match routines */
|
||||||
|
|
||||||
|
/* in trees.c */
|
||||||
|
void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
|
||||||
|
int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
|
||||||
|
void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
|
||||||
|
ulg stored_len, int last));
|
||||||
|
void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
|
||||||
|
void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
|
||||||
|
void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
|
||||||
|
ulg stored_len, int last));
|
||||||
|
|
||||||
|
#define d_code(dist) \
|
||||||
|
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
|
||||||
|
/* Mapping from a distance to a distance code. dist is the distance - 1 and
|
||||||
|
* must not have side effects. _dist_code[256] and _dist_code[257] are never
|
||||||
|
* used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ZLIB_DEBUG
|
||||||
|
/* Inline versions of _tr_tally for speed: */
|
||||||
|
|
||||||
|
#if defined(GEN_TREES_H) || !defined(STDC)
|
||||||
|
extern uch ZLIB_INTERNAL _length_code[];
|
||||||
|
extern uch ZLIB_INTERNAL _dist_code[];
|
||||||
|
#else
|
||||||
|
extern const uch ZLIB_INTERNAL _length_code[];
|
||||||
|
extern const uch ZLIB_INTERNAL _dist_code[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# define _tr_tally_lit(s, c, flush) \
|
||||||
|
{ uch cc = (c); \
|
||||||
|
s->d_buf[s->last_lit] = 0; \
|
||||||
|
s->l_buf[s->last_lit++] = cc; \
|
||||||
|
s->dyn_ltree[cc].Freq++; \
|
||||||
|
flush = (s->last_lit == s->lit_bufsize-1); \
|
||||||
|
}
|
||||||
|
# define _tr_tally_dist(s, distance, length, flush) \
|
||||||
|
{ uch len = (uch)(length); \
|
||||||
|
ush dist = (ush)(distance); \
|
||||||
|
s->d_buf[s->last_lit] = dist; \
|
||||||
|
s->l_buf[s->last_lit++] = len; \
|
||||||
|
dist--; \
|
||||||
|
s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
|
||||||
|
s->dyn_dtree[d_code(dist)].Freq++; \
|
||||||
|
flush = (s->last_lit == s->lit_bufsize-1); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
|
||||||
|
# define _tr_tally_dist(s, distance, length, flush) \
|
||||||
|
flush = _tr_tally(s, distance, length)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* DEFLATE_H */
|
218
PdbChecker/zlib/gzguts.h
Normal file
218
PdbChecker/zlib/gzguts.h
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/* gzguts.h -- zlib internal header definitions for gz* operations
|
||||||
|
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef _LARGEFILE64_SOURCE
|
||||||
|
# ifndef _LARGEFILE_SOURCE
|
||||||
|
# define _LARGEFILE_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# ifdef _FILE_OFFSET_BITS
|
||||||
|
# undef _FILE_OFFSET_BITS
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_HIDDEN
|
||||||
|
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
||||||
|
#else
|
||||||
|
# define ZLIB_INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "zlib.h"
|
||||||
|
#ifdef STDC
|
||||||
|
# include <string.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _POSIX_SOURCE
|
||||||
|
# define _POSIX_SOURCE
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
|
||||||
|
# include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
# define WIDECHAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WINAPI_FAMILY
|
||||||
|
# define open _open
|
||||||
|
# define read _read
|
||||||
|
# define write _write
|
||||||
|
# define close _close
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
||||||
|
# define NO_GZCOMPRESS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CYGWIN__)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
|
||||||
|
# ifndef HAVE_VSNPRINTF
|
||||||
|
# define HAVE_VSNPRINTF
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_VSNPRINTF
|
||||||
|
# ifdef MSDOS
|
||||||
|
/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
|
||||||
|
but for now we just assume it doesn't. */
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __TURBOC__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef WIN32
|
||||||
|
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
|
||||||
|
# if !defined(vsnprintf) && !defined(NO_vsnprintf)
|
||||||
|
# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
|
||||||
|
# define vsnprintf _vsnprintf
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# ifdef __SASC
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef VMS
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __OS400__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
# ifdef __MVS__
|
||||||
|
# define NO_vsnprintf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* unlike snprintf (which is required in C99), _snprintf does not guarantee
|
||||||
|
null termination of the result -- however this is only used in gzlib.c where
|
||||||
|
the result is assured to fit in the space provided */
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
|
# define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef local
|
||||||
|
# define local static
|
||||||
|
#endif
|
||||||
|
/* since "static" is used to mean two completely different things in C, we
|
||||||
|
define "local" for the non-static meaning of "static", for readability
|
||||||
|
(compile with -Dlocal if your debugger can't find static symbols) */
|
||||||
|
|
||||||
|
/* gz* functions always use library allocation functions */
|
||||||
|
#ifndef STDC
|
||||||
|
extern voidp malloc OF((uInt size));
|
||||||
|
extern void free OF((voidpf ptr));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* get errno and strerror definition */
|
||||||
|
#if defined UNDER_CE
|
||||||
|
# include <windows.h>
|
||||||
|
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
|
||||||
|
#else
|
||||||
|
# ifndef NO_STRERROR
|
||||||
|
# include <errno.h>
|
||||||
|
# define zstrerror() strerror(errno)
|
||||||
|
# else
|
||||||
|
# define zstrerror() "stdio error (consult errno)"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
|
#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
|
||||||
|
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
|
||||||
|
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default memLevel */
|
||||||
|
#if MAX_MEM_LEVEL >= 8
|
||||||
|
# define DEF_MEM_LEVEL 8
|
||||||
|
#else
|
||||||
|
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* default i/o buffer size -- double this for output when reading (this and
|
||||||
|
twice this must be able to fit in an unsigned type) */
|
||||||
|
#define GZBUFSIZE 8192
|
||||||
|
|
||||||
|
/* gzip modes, also provide a little integrity check on the passed structure */
|
||||||
|
#define GZ_NONE 0
|
||||||
|
#define GZ_READ 7247
|
||||||
|
#define GZ_WRITE 31153
|
||||||
|
#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
|
||||||
|
|
||||||
|
/* values for gz_state how */
|
||||||
|
#define LOOK 0 /* look for a gzip header */
|
||||||
|
#define COPY 1 /* copy input directly */
|
||||||
|
#define GZIP 2 /* decompress a gzip stream */
|
||||||
|
|
||||||
|
/* internal gzip file state data structure */
|
||||||
|
typedef struct {
|
||||||
|
/* exposed contents for gzgetc() macro */
|
||||||
|
struct gzFile_s x; /* "x" for exposed */
|
||||||
|
/* x.have: number of bytes available at x.next */
|
||||||
|
/* x.next: next output data to deliver or write */
|
||||||
|
/* x.pos: current position in uncompressed data */
|
||||||
|
/* used for both reading and writing */
|
||||||
|
int mode; /* see gzip modes above */
|
||||||
|
int fd; /* file descriptor */
|
||||||
|
char *path; /* path or fd for error messages */
|
||||||
|
unsigned size; /* buffer size, zero if not allocated yet */
|
||||||
|
unsigned want; /* requested buffer size, default is GZBUFSIZE */
|
||||||
|
unsigned char *in; /* input buffer (double-sized when writing) */
|
||||||
|
unsigned char *out; /* output buffer (double-sized when reading) */
|
||||||
|
int direct; /* 0 if processing gzip, 1 if transparent */
|
||||||
|
/* just for reading */
|
||||||
|
int how; /* 0: get header, 1: copy, 2: decompress */
|
||||||
|
z_off64_t start; /* where the gzip data started, for rewinding */
|
||||||
|
int eof; /* true if end of input file reached */
|
||||||
|
int past; /* true if read requested past end */
|
||||||
|
/* just for writing */
|
||||||
|
int level; /* compression level */
|
||||||
|
int strategy; /* compression strategy */
|
||||||
|
/* seek request */
|
||||||
|
z_off64_t skip; /* amount to skip (already rewound if backwards) */
|
||||||
|
int seek; /* true if seek request pending */
|
||||||
|
/* error information */
|
||||||
|
int err; /* error code */
|
||||||
|
char *msg; /* error message */
|
||||||
|
/* zlib inflate or deflate stream */
|
||||||
|
z_stream strm; /* stream structure in-place (not a pointer) */
|
||||||
|
} gz_state;
|
||||||
|
typedef gz_state FAR *gz_statep;
|
||||||
|
|
||||||
|
/* shared functions */
|
||||||
|
void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
|
||||||
|
#if defined UNDER_CE
|
||||||
|
char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
|
||||||
|
value -- needed when comparing unsigned to z_off64_t, which is signed
|
||||||
|
(possible z_off64_t types off_t, off64_t, and long are all signed) */
|
||||||
|
#ifdef INT_MAX
|
||||||
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
|
||||||
|
#else
|
||||||
|
unsigned ZLIB_INTERNAL gz_intmax OF((void));
|
||||||
|
# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
|
||||||
|
#endif
|
640
PdbChecker/zlib/infback.c
Normal file
640
PdbChecker/zlib/infback.c
Normal file
@ -0,0 +1,640 @@
|
|||||||
|
/* infback.c -- inflate using a call-back interface
|
||||||
|
* Copyright (C) 1995-2016 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This code is largely copied from inflate.c. Normally either infback.o or
|
||||||
|
inflate.o would be linked into an application--not both. The interface
|
||||||
|
with inffast.c is retained so that optimized assembler-coded versions of
|
||||||
|
inflate_fast() can be used with either inflate.c or infback.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
#include "inftrees.h"
|
||||||
|
#include "inflate.h"
|
||||||
|
#include "inffast.h"
|
||||||
|
|
||||||
|
/* function prototypes */
|
||||||
|
local void fixedtables OF((struct inflate_state FAR *state));
|
||||||
|
|
||||||
|
/*
|
||||||
|
strm provides memory allocation functions in zalloc and zfree, or
|
||||||
|
Z_NULL to use the library memory allocation functions.
|
||||||
|
|
||||||
|
windowBits is in the range 8..15, and window is a user-supplied
|
||||||
|
window and output buffer that is 2**windowBits bytes.
|
||||||
|
*/
|
||||||
|
int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
|
||||||
|
z_streamp strm;
|
||||||
|
int windowBits;
|
||||||
|
unsigned char FAR *window;
|
||||||
|
const char *version;
|
||||||
|
int stream_size;
|
||||||
|
{
|
||||||
|
struct inflate_state FAR *state;
|
||||||
|
|
||||||
|
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
|
||||||
|
stream_size != (int)(sizeof(z_stream)))
|
||||||
|
return Z_VERSION_ERROR;
|
||||||
|
if (strm == Z_NULL || window == Z_NULL ||
|
||||||
|
windowBits < 8 || windowBits > 15)
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
strm->msg = Z_NULL; /* in case we return an error */
|
||||||
|
if (strm->zalloc == (alloc_func)0) {
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
#else
|
||||||
|
strm->zalloc = zcalloc;
|
||||||
|
strm->opaque = (voidpf)0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (strm->zfree == (free_func)0)
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
#else
|
||||||
|
strm->zfree = zcfree;
|
||||||
|
#endif
|
||||||
|
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
|
||||||
|
sizeof(struct inflate_state));
|
||||||
|
if (state == Z_NULL) return Z_MEM_ERROR;
|
||||||
|
Tracev((stderr, "inflate: allocated\n"));
|
||||||
|
strm->state = (struct internal_state FAR *)state;
|
||||||
|
state->dmax = 32768U;
|
||||||
|
state->wbits = (uInt)windowBits;
|
||||||
|
state->wsize = 1U << windowBits;
|
||||||
|
state->window = window;
|
||||||
|
state->wnext = 0;
|
||||||
|
state->whave = 0;
|
||||||
|
return Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return state with length and distance decoding tables and index sizes set to
|
||||||
|
fixed code decoding. Normally this returns fixed tables from inffixed.h.
|
||||||
|
If BUILDFIXED is defined, then instead this routine builds the tables the
|
||||||
|
first time it's called, and returns those tables the first time and
|
||||||
|
thereafter. This reduces the size of the code by about 2K bytes, in
|
||||||
|
exchange for a little execution time. However, BUILDFIXED should not be
|
||||||
|
used for threaded applications, since the rewriting of the tables and virgin
|
||||||
|
may not be thread-safe.
|
||||||
|
*/
|
||||||
|
local void fixedtables(state)
|
||||||
|
struct inflate_state FAR *state;
|
||||||
|
{
|
||||||
|
#ifdef BUILDFIXED
|
||||||
|
static int virgin = 1;
|
||||||
|
static code *lenfix, *distfix;
|
||||||
|
static code fixed[544];
|
||||||
|
|
||||||
|
/* build fixed huffman tables if first call (may not be thread safe) */
|
||||||
|
if (virgin) {
|
||||||
|
unsigned sym, bits;
|
||||||
|
static code *next;
|
||||||
|
|
||||||
|
/* literal/length table */
|
||||||
|
sym = 0;
|
||||||
|
while (sym < 144) state->lens[sym++] = 8;
|
||||||
|
while (sym < 256) state->lens[sym++] = 9;
|
||||||
|
while (sym < 280) state->lens[sym++] = 7;
|
||||||
|
while (sym < 288) state->lens[sym++] = 8;
|
||||||
|
next = fixed;
|
||||||
|
lenfix = next;
|
||||||
|
bits = 9;
|
||||||
|
inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
|
||||||
|
|
||||||
|
/* distance table */
|
||||||
|
sym = 0;
|
||||||
|
while (sym < 32) state->lens[sym++] = 5;
|
||||||
|
distfix = next;
|
||||||
|
bits = 5;
|
||||||
|
inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
|
||||||
|
|
||||||
|
/* do this just once */
|
||||||
|
virgin = 0;
|
||||||
|
}
|
||||||
|
#else /* !BUILDFIXED */
|
||||||
|
# include "inffixed.h"
|
||||||
|
#endif /* BUILDFIXED */
|
||||||
|
state->lencode = lenfix;
|
||||||
|
state->lenbits = 9;
|
||||||
|
state->distcode = distfix;
|
||||||
|
state->distbits = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Macros for inflateBack(): */
|
||||||
|
|
||||||
|
/* Load returned state from inflate_fast() */
|
||||||
|
#define LOAD() \
|
||||||
|
do { \
|
||||||
|
put = strm->next_out; \
|
||||||
|
left = strm->avail_out; \
|
||||||
|
next = strm->next_in; \
|
||||||
|
have = strm->avail_in; \
|
||||||
|
hold = state->hold; \
|
||||||
|
bits = state->bits; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Set state from registers for inflate_fast() */
|
||||||
|
#define RESTORE() \
|
||||||
|
do { \
|
||||||
|
strm->next_out = put; \
|
||||||
|
strm->avail_out = left; \
|
||||||
|
strm->next_in = next; \
|
||||||
|
strm->avail_in = have; \
|
||||||
|
state->hold = hold; \
|
||||||
|
state->bits = bits; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Clear the input bit accumulator */
|
||||||
|
#define INITBITS() \
|
||||||
|
do { \
|
||||||
|
hold = 0; \
|
||||||
|
bits = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Assure that some input is available. If input is requested, but denied,
|
||||||
|
then return a Z_BUF_ERROR from inflateBack(). */
|
||||||
|
#define PULL() \
|
||||||
|
do { \
|
||||||
|
if (have == 0) { \
|
||||||
|
have = in(in_desc, &next); \
|
||||||
|
if (have == 0) { \
|
||||||
|
next = Z_NULL; \
|
||||||
|
ret = Z_BUF_ERROR; \
|
||||||
|
goto inf_leave; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Get a byte of input into the bit accumulator, or return from inflateBack()
|
||||||
|
with an error if there is no input available. */
|
||||||
|
#define PULLBYTE() \
|
||||||
|
do { \
|
||||||
|
PULL(); \
|
||||||
|
have--; \
|
||||||
|
hold += (unsigned long)(*next++) << bits; \
|
||||||
|
bits += 8; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Assure that there are at least n bits in the bit accumulator. If there is
|
||||||
|
not enough available input to do that, then return from inflateBack() with
|
||||||
|
an error. */
|
||||||
|
#define NEEDBITS(n) \
|
||||||
|
do { \
|
||||||
|
while (bits < (unsigned)(n)) \
|
||||||
|
PULLBYTE(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Return the low n bits of the bit accumulator (n < 16) */
|
||||||
|
#define BITS(n) \
|
||||||
|
((unsigned)hold & ((1U << (n)) - 1))
|
||||||
|
|
||||||
|
/* Remove n bits from the bit accumulator */
|
||||||
|
#define DROPBITS(n) \
|
||||||
|
do { \
|
||||||
|
hold >>= (n); \
|
||||||
|
bits -= (unsigned)(n); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Remove zero to seven bits as needed to go to a byte boundary */
|
||||||
|
#define BYTEBITS() \
|
||||||
|
do { \
|
||||||
|
hold >>= bits & 7; \
|
||||||
|
bits -= bits & 7; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Assure that some output space is available, by writing out the window
|
||||||
|
if it's full. If the write fails, return from inflateBack() with a
|
||||||
|
Z_BUF_ERROR. */
|
||||||
|
#define ROOM() \
|
||||||
|
do { \
|
||||||
|
if (left == 0) { \
|
||||||
|
put = state->window; \
|
||||||
|
left = state->wsize; \
|
||||||
|
state->whave = left; \
|
||||||
|
if (out(out_desc, put, left)) { \
|
||||||
|
ret = Z_BUF_ERROR; \
|
||||||
|
goto inf_leave; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
strm provides the memory allocation functions and window buffer on input,
|
||||||
|
and provides information on the unused input on return. For Z_DATA_ERROR
|
||||||
|
returns, strm will also provide an error message.
|
||||||
|
|
||||||
|
in() and out() are the call-back input and output functions. When
|
||||||
|
inflateBack() needs more input, it calls in(). When inflateBack() has
|
||||||
|
filled the window with output, or when it completes with data in the
|
||||||
|
window, it calls out() to write out the data. The application must not
|
||||||
|
change the provided input until in() is called again or inflateBack()
|
||||||
|
returns. The application must not change the window/output buffer until
|
||||||
|
inflateBack() returns.
|
||||||
|
|
||||||
|
in() and out() are called with a descriptor parameter provided in the
|
||||||
|
inflateBack() call. This parameter can be a structure that provides the
|
||||||
|
information required to do the read or write, as well as accumulated
|
||||||
|
information on the input and output such as totals and check values.
|
||||||
|
|
||||||
|
in() should return zero on failure. out() should return non-zero on
|
||||||
|
failure. If either in() or out() fails, than inflateBack() returns a
|
||||||
|
Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
|
||||||
|
was in() or out() that caused in the error. Otherwise, inflateBack()
|
||||||
|
returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
|
||||||
|
error, or Z_MEM_ERROR if it could not allocate memory for the state.
|
||||||
|
inflateBack() can also return Z_STREAM_ERROR if the input parameters
|
||||||
|
are not correct, i.e. strm is Z_NULL or the state was not initialized.
|
||||||
|
*/
|
||||||
|
int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
|
||||||
|
z_streamp strm;
|
||||||
|
in_func in;
|
||||||
|
void FAR *in_desc;
|
||||||
|
out_func out;
|
||||||
|
void FAR *out_desc;
|
||||||
|
{
|
||||||
|
struct inflate_state FAR *state;
|
||||||
|
z_const unsigned char FAR *next; /* next input */
|
||||||
|
unsigned char FAR *put; /* next output */
|
||||||
|
unsigned have, left; /* available input and output */
|
||||||
|
unsigned long hold; /* bit buffer */
|
||||||
|
unsigned bits; /* bits in bit buffer */
|
||||||
|
unsigned copy; /* number of stored or match bytes to copy */
|
||||||
|
unsigned char FAR *from; /* where to copy match bytes from */
|
||||||
|
code here; /* current decoding table entry */
|
||||||
|
code last; /* parent table entry */
|
||||||
|
unsigned len; /* length to copy for repeats, bits to drop */
|
||||||
|
int ret; /* return code */
|
||||||
|
static const unsigned short order[19] = /* permutation of code lengths */
|
||||||
|
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
|
||||||
|
|
||||||
|
/* Check that the strm exists and that the state was initialized */
|
||||||
|
if (strm == Z_NULL || strm->state == Z_NULL)
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
state = (struct inflate_state FAR *)strm->state;
|
||||||
|
|
||||||
|
/* Reset the state */
|
||||||
|
strm->msg = Z_NULL;
|
||||||
|
state->mode = TYPE;
|
||||||
|
state->last = 0;
|
||||||
|
state->whave = 0;
|
||||||
|
next = strm->next_in;
|
||||||
|
have = next != Z_NULL ? strm->avail_in : 0;
|
||||||
|
hold = 0;
|
||||||
|
bits = 0;
|
||||||
|
put = state->window;
|
||||||
|
left = state->wsize;
|
||||||
|
|
||||||
|
/* Inflate until end of block marked as last */
|
||||||
|
for (;;)
|
||||||
|
switch (state->mode) {
|
||||||
|
case TYPE:
|
||||||
|
/* determine and dispatch block type */
|
||||||
|
if (state->last) {
|
||||||
|
BYTEBITS();
|
||||||
|
state->mode = DONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
NEEDBITS(3);
|
||||||
|
state->last = BITS(1);
|
||||||
|
DROPBITS(1);
|
||||||
|
switch (BITS(2)) {
|
||||||
|
case 0: /* stored block */
|
||||||
|
Tracev((stderr, "inflate: stored block%s\n",
|
||||||
|
state->last ? " (last)" : ""));
|
||||||
|
state->mode = STORED;
|
||||||
|
break;
|
||||||
|
case 1: /* fixed block */
|
||||||
|
fixedtables(state);
|
||||||
|
Tracev((stderr, "inflate: fixed codes block%s\n",
|
||||||
|
state->last ? " (last)" : ""));
|
||||||
|
state->mode = LEN; /* decode codes */
|
||||||
|
break;
|
||||||
|
case 2: /* dynamic block */
|
||||||
|
Tracev((stderr, "inflate: dynamic codes block%s\n",
|
||||||
|
state->last ? " (last)" : ""));
|
||||||
|
state->mode = TABLE;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
strm->msg = (char *)"invalid block type";
|
||||||
|
state->mode = BAD;
|
||||||
|
}
|
||||||
|
DROPBITS(2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STORED:
|
||||||
|
/* get and verify stored block length */
|
||||||
|
BYTEBITS(); /* go to byte boundary */
|
||||||
|
NEEDBITS(32);
|
||||||
|
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
|
||||||
|
strm->msg = (char *)"invalid stored block lengths";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
state->length = (unsigned)hold & 0xffff;
|
||||||
|
Tracev((stderr, "inflate: stored length %u\n",
|
||||||
|
state->length));
|
||||||
|
INITBITS();
|
||||||
|
|
||||||
|
/* copy stored block from input to output */
|
||||||
|
while (state->length != 0) {
|
||||||
|
copy = state->length;
|
||||||
|
PULL();
|
||||||
|
ROOM();
|
||||||
|
if (copy > have) copy = have;
|
||||||
|
if (copy > left) copy = left;
|
||||||
|
zmemcpy(put, next, copy);
|
||||||
|
have -= copy;
|
||||||
|
next += copy;
|
||||||
|
left -= copy;
|
||||||
|
put += copy;
|
||||||
|
state->length -= copy;
|
||||||
|
}
|
||||||
|
Tracev((stderr, "inflate: stored end\n"));
|
||||||
|
state->mode = TYPE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TABLE:
|
||||||
|
/* get dynamic table entries descriptor */
|
||||||
|
NEEDBITS(14);
|
||||||
|
state->nlen = BITS(5) + 257;
|
||||||
|
DROPBITS(5);
|
||||||
|
state->ndist = BITS(5) + 1;
|
||||||
|
DROPBITS(5);
|
||||||
|
state->ncode = BITS(4) + 4;
|
||||||
|
DROPBITS(4);
|
||||||
|
#ifndef PKZIP_BUG_WORKAROUND
|
||||||
|
if (state->nlen > 286 || state->ndist > 30) {
|
||||||
|
strm->msg = (char *)"too many length or distance symbols";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Tracev((stderr, "inflate: table sizes ok\n"));
|
||||||
|
|
||||||
|
/* get code length code lengths (not a typo) */
|
||||||
|
state->have = 0;
|
||||||
|
while (state->have < state->ncode) {
|
||||||
|
NEEDBITS(3);
|
||||||
|
state->lens[order[state->have++]] = (unsigned short)BITS(3);
|
||||||
|
DROPBITS(3);
|
||||||
|
}
|
||||||
|
while (state->have < 19)
|
||||||
|
state->lens[order[state->have++]] = 0;
|
||||||
|
state->next = state->codes;
|
||||||
|
state->lencode = (code const FAR *)(state->next);
|
||||||
|
state->lenbits = 7;
|
||||||
|
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
||||||
|
&(state->lenbits), state->work);
|
||||||
|
if (ret) {
|
||||||
|
strm->msg = (char *)"invalid code lengths set";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Tracev((stderr, "inflate: code lengths ok\n"));
|
||||||
|
|
||||||
|
/* get length and distance code code lengths */
|
||||||
|
state->have = 0;
|
||||||
|
while (state->have < state->nlen + state->ndist) {
|
||||||
|
for (;;) {
|
||||||
|
here = state->lencode[BITS(state->lenbits)];
|
||||||
|
if ((unsigned)(here.bits) <= bits) break;
|
||||||
|
PULLBYTE();
|
||||||
|
}
|
||||||
|
if (here.val < 16) {
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
state->lens[state->have++] = here.val;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (here.val == 16) {
|
||||||
|
NEEDBITS(here.bits + 2);
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
if (state->have == 0) {
|
||||||
|
strm->msg = (char *)"invalid bit length repeat";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = (unsigned)(state->lens[state->have - 1]);
|
||||||
|
copy = 3 + BITS(2);
|
||||||
|
DROPBITS(2);
|
||||||
|
}
|
||||||
|
else if (here.val == 17) {
|
||||||
|
NEEDBITS(here.bits + 3);
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
len = 0;
|
||||||
|
copy = 3 + BITS(3);
|
||||||
|
DROPBITS(3);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NEEDBITS(here.bits + 7);
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
len = 0;
|
||||||
|
copy = 11 + BITS(7);
|
||||||
|
DROPBITS(7);
|
||||||
|
}
|
||||||
|
if (state->have + copy > state->nlen + state->ndist) {
|
||||||
|
strm->msg = (char *)"invalid bit length repeat";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (copy--)
|
||||||
|
state->lens[state->have++] = (unsigned short)len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* handle error breaks in while */
|
||||||
|
if (state->mode == BAD) break;
|
||||||
|
|
||||||
|
/* check for end-of-block code (better have one) */
|
||||||
|
if (state->lens[256] == 0) {
|
||||||
|
strm->msg = (char *)"invalid code -- missing end-of-block";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* build code tables -- note: do not change the lenbits or distbits
|
||||||
|
values here (9 and 6) without reading the comments in inftrees.h
|
||||||
|
concerning the ENOUGH constants, which depend on those values */
|
||||||
|
state->next = state->codes;
|
||||||
|
state->lencode = (code const FAR *)(state->next);
|
||||||
|
state->lenbits = 9;
|
||||||
|
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
||||||
|
&(state->lenbits), state->work);
|
||||||
|
if (ret) {
|
||||||
|
strm->msg = (char *)"invalid literal/lengths set";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
state->distcode = (code const FAR *)(state->next);
|
||||||
|
state->distbits = 6;
|
||||||
|
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
||||||
|
&(state->next), &(state->distbits), state->work);
|
||||||
|
if (ret) {
|
||||||
|
strm->msg = (char *)"invalid distances set";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Tracev((stderr, "inflate: codes ok\n"));
|
||||||
|
state->mode = LEN;
|
||||||
|
|
||||||
|
case LEN:
|
||||||
|
/* use inflate_fast() if we have enough input and output */
|
||||||
|
if (have >= 6 && left >= 258) {
|
||||||
|
RESTORE();
|
||||||
|
if (state->whave < state->wsize)
|
||||||
|
state->whave = state->wsize - left;
|
||||||
|
inflate_fast(strm, state->wsize);
|
||||||
|
LOAD();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get a literal, length, or end-of-block code */
|
||||||
|
for (;;) {
|
||||||
|
here = state->lencode[BITS(state->lenbits)];
|
||||||
|
if ((unsigned)(here.bits) <= bits) break;
|
||||||
|
PULLBYTE();
|
||||||
|
}
|
||||||
|
if (here.op && (here.op & 0xf0) == 0) {
|
||||||
|
last = here;
|
||||||
|
for (;;) {
|
||||||
|
here = state->lencode[last.val +
|
||||||
|
(BITS(last.bits + last.op) >> last.bits)];
|
||||||
|
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
||||||
|
PULLBYTE();
|
||||||
|
}
|
||||||
|
DROPBITS(last.bits);
|
||||||
|
}
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
state->length = (unsigned)here.val;
|
||||||
|
|
||||||
|
/* process literal */
|
||||||
|
if (here.op == 0) {
|
||||||
|
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
||||||
|
"inflate: literal '%c'\n" :
|
||||||
|
"inflate: literal 0x%02x\n", here.val));
|
||||||
|
ROOM();
|
||||||
|
*put++ = (unsigned char)(state->length);
|
||||||
|
left--;
|
||||||
|
state->mode = LEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* process end of block */
|
||||||
|
if (here.op & 32) {
|
||||||
|
Tracevv((stderr, "inflate: end of block\n"));
|
||||||
|
state->mode = TYPE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invalid code */
|
||||||
|
if (here.op & 64) {
|
||||||
|
strm->msg = (char *)"invalid literal/length code";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* length code -- get extra bits, if any */
|
||||||
|
state->extra = (unsigned)(here.op) & 15;
|
||||||
|
if (state->extra != 0) {
|
||||||
|
NEEDBITS(state->extra);
|
||||||
|
state->length += BITS(state->extra);
|
||||||
|
DROPBITS(state->extra);
|
||||||
|
}
|
||||||
|
Tracevv((stderr, "inflate: length %u\n", state->length));
|
||||||
|
|
||||||
|
/* get distance code */
|
||||||
|
for (;;) {
|
||||||
|
here = state->distcode[BITS(state->distbits)];
|
||||||
|
if ((unsigned)(here.bits) <= bits) break;
|
||||||
|
PULLBYTE();
|
||||||
|
}
|
||||||
|
if ((here.op & 0xf0) == 0) {
|
||||||
|
last = here;
|
||||||
|
for (;;) {
|
||||||
|
here = state->distcode[last.val +
|
||||||
|
(BITS(last.bits + last.op) >> last.bits)];
|
||||||
|
if ((unsigned)(last.bits + here.bits) <= bits) break;
|
||||||
|
PULLBYTE();
|
||||||
|
}
|
||||||
|
DROPBITS(last.bits);
|
||||||
|
}
|
||||||
|
DROPBITS(here.bits);
|
||||||
|
if (here.op & 64) {
|
||||||
|
strm->msg = (char *)"invalid distance code";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
state->offset = (unsigned)here.val;
|
||||||
|
|
||||||
|
/* get distance extra bits, if any */
|
||||||
|
state->extra = (unsigned)(here.op) & 15;
|
||||||
|
if (state->extra != 0) {
|
||||||
|
NEEDBITS(state->extra);
|
||||||
|
state->offset += BITS(state->extra);
|
||||||
|
DROPBITS(state->extra);
|
||||||
|
}
|
||||||
|
if (state->offset > state->wsize - (state->whave < state->wsize ?
|
||||||
|
left : 0)) {
|
||||||
|
strm->msg = (char *)"invalid distance too far back";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Tracevv((stderr, "inflate: distance %u\n", state->offset));
|
||||||
|
|
||||||
|
/* copy match from window to output */
|
||||||
|
do {
|
||||||
|
ROOM();
|
||||||
|
copy = state->wsize - state->offset;
|
||||||
|
if (copy < left) {
|
||||||
|
from = put + copy;
|
||||||
|
copy = left - copy;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
from = put - state->offset;
|
||||||
|
copy = left;
|
||||||
|
}
|
||||||
|
if (copy > state->length) copy = state->length;
|
||||||
|
state->length -= copy;
|
||||||
|
left -= copy;
|
||||||
|
do {
|
||||||
|
*put++ = *from++;
|
||||||
|
} while (--copy);
|
||||||
|
} while (state->length != 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DONE:
|
||||||
|
/* inflate stream terminated properly -- write leftover output */
|
||||||
|
ret = Z_STREAM_END;
|
||||||
|
if (left < state->wsize) {
|
||||||
|
if (out(out_desc, state->window, state->wsize - left))
|
||||||
|
ret = Z_BUF_ERROR;
|
||||||
|
}
|
||||||
|
goto inf_leave;
|
||||||
|
|
||||||
|
case BAD:
|
||||||
|
ret = Z_DATA_ERROR;
|
||||||
|
goto inf_leave;
|
||||||
|
|
||||||
|
default: /* can't happen, but makes compilers happy */
|
||||||
|
ret = Z_STREAM_ERROR;
|
||||||
|
goto inf_leave;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return unused input */
|
||||||
|
inf_leave:
|
||||||
|
strm->next_in = next;
|
||||||
|
strm->avail_in = have;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZEXPORT inflateBackEnd(strm)
|
||||||
|
z_streamp strm;
|
||||||
|
{
|
||||||
|
if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
|
||||||
|
return Z_STREAM_ERROR;
|
||||||
|
ZFREE(strm, strm->state);
|
||||||
|
strm->state = Z_NULL;
|
||||||
|
Tracev((stderr, "inflate: end\n"));
|
||||||
|
return Z_OK;
|
||||||
|
}
|
323
PdbChecker/zlib/inffast.c
Normal file
323
PdbChecker/zlib/inffast.c
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
/* inffast.c -- fast decoding
|
||||||
|
* Copyright (C) 1995-2017 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
#include "inftrees.h"
|
||||||
|
#include "inflate.h"
|
||||||
|
#include "inffast.h"
|
||||||
|
|
||||||
|
#ifdef ASMINF
|
||||||
|
# pragma message("Assembler code may have bugs -- use at your own risk")
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
Decode literal, length, and distance codes and write out the resulting
|
||||||
|
literal and match bytes until either not enough input or output is
|
||||||
|
available, an end-of-block is encountered, or a data error is encountered.
|
||||||
|
When large enough input and output buffers are supplied to inflate(), for
|
||||||
|
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
||||||
|
inflate execution time is spent in this routine.
|
||||||
|
|
||||||
|
Entry assumptions:
|
||||||
|
|
||||||
|
state->mode == LEN
|
||||||
|
strm->avail_in >= 6
|
||||||
|
strm->avail_out >= 258
|
||||||
|
start >= strm->avail_out
|
||||||
|
state->bits < 8
|
||||||
|
|
||||||
|
On return, state->mode is one of:
|
||||||
|
|
||||||
|
LEN -- ran out of enough output space or enough available input
|
||||||
|
TYPE -- reached end of block code, inflate() to interpret next block
|
||||||
|
BAD -- error in block data
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- The maximum input bits used by a length/distance pair is 15 bits for the
|
||||||
|
length code, 5 bits for the length extra, 15 bits for the distance code,
|
||||||
|
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
||||||
|
Therefore if strm->avail_in >= 6, then there is enough input to avoid
|
||||||
|
checking for available input while decoding.
|
||||||
|
|
||||||
|
- The maximum bytes that a single length/distance pair can output is 258
|
||||||
|
bytes, which is the maximum length that can be coded. inflate_fast()
|
||||||
|
requires strm->avail_out >= 258 for each loop to avoid checking for
|
||||||
|
output space.
|
||||||
|
*/
|
||||||
|
void ZLIB_INTERNAL inflate_fast(strm, start)
|
||||||
|
z_streamp strm;
|
||||||
|
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||||
|
{
|
||||||
|
struct inflate_state FAR *state;
|
||||||
|
z_const unsigned char FAR *in; /* local strm->next_in */
|
||||||
|
z_const unsigned char FAR *last; /* have enough input while in < last */
|
||||||
|
unsigned char FAR *out; /* local strm->next_out */
|
||||||
|
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
|
||||||
|
unsigned char FAR *end; /* while out < end, enough space available */
|
||||||
|
#ifdef INFLATE_STRICT
|
||||||
|
unsigned dmax; /* maximum distance from zlib header */
|
||||||
|
#endif
|
||||||
|
unsigned wsize; /* window size or zero if not using window */
|
||||||
|
unsigned whave; /* valid bytes in the window */
|
||||||
|
unsigned wnext; /* window write index */
|
||||||
|
unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
|
||||||
|
unsigned long hold; /* local strm->hold */
|
||||||
|
unsigned bits; /* local strm->bits */
|
||||||
|
code const FAR *lcode; /* local strm->lencode */
|
||||||
|
code const FAR *dcode; /* local strm->distcode */
|
||||||
|
unsigned lmask; /* mask for first level of length codes */
|
||||||
|
unsigned dmask; /* mask for first level of distance codes */
|
||||||
|
code here; /* retrieved table entry */
|
||||||
|
unsigned op; /* code bits, operation, extra bits, or */
|
||||||
|
/* window position, window bytes to copy */
|
||||||
|
unsigned len; /* match length, unused bytes */
|
||||||
|
unsigned dist; /* match distance */
|
||||||
|
unsigned char FAR *from; /* where to copy match from */
|
||||||
|
|
||||||
|
/* copy state to local variables */
|
||||||
|
state = (struct inflate_state FAR *)strm->state;
|
||||||
|
in = strm->next_in;
|
||||||
|
last = in + (strm->avail_in - 5);
|
||||||
|
out = strm->next_out;
|
||||||
|
beg = out - (start - strm->avail_out);
|
||||||
|
end = out + (strm->avail_out - 257);
|
||||||
|
#ifdef INFLATE_STRICT
|
||||||
|
dmax = state->dmax;
|
||||||
|
#endif
|
||||||
|
wsize = state->wsize;
|
||||||
|
whave = state->whave;
|
||||||
|
wnext = state->wnext;
|
||||||
|
window = state->window;
|
||||||
|
hold = state->hold;
|
||||||
|
bits = state->bits;
|
||||||
|
lcode = state->lencode;
|
||||||
|
dcode = state->distcode;
|
||||||
|
lmask = (1U << state->lenbits) - 1;
|
||||||
|
dmask = (1U << state->distbits) - 1;
|
||||||
|
|
||||||
|
/* decode literals and length/distances until end-of-block or not enough
|
||||||
|
input data or output space */
|
||||||
|
do {
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
here = lcode[hold & lmask];
|
||||||
|
dolen:
|
||||||
|
op = (unsigned)(here.bits);
|
||||||
|
hold >>= op;
|
||||||
|
bits -= op;
|
||||||
|
op = (unsigned)(here.op);
|
||||||
|
if (op == 0) { /* literal */
|
||||||
|
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
||||||
|
"inflate: literal '%c'\n" :
|
||||||
|
"inflate: literal 0x%02x\n", here.val));
|
||||||
|
*out++ = (unsigned char)(here.val);
|
||||||
|
}
|
||||||
|
else if (op & 16) { /* length base */
|
||||||
|
len = (unsigned)(here.val);
|
||||||
|
op &= 15; /* number of extra bits */
|
||||||
|
if (op) {
|
||||||
|
if (bits < op) {
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
len += (unsigned)hold & ((1U << op) - 1);
|
||||||
|
hold >>= op;
|
||||||
|
bits -= op;
|
||||||
|
}
|
||||||
|
Tracevv((stderr, "inflate: length %u\n", len));
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
here = dcode[hold & dmask];
|
||||||
|
dodist:
|
||||||
|
op = (unsigned)(here.bits);
|
||||||
|
hold >>= op;
|
||||||
|
bits -= op;
|
||||||
|
op = (unsigned)(here.op);
|
||||||
|
if (op & 16) { /* distance base */
|
||||||
|
dist = (unsigned)(here.val);
|
||||||
|
op &= 15; /* number of extra bits */
|
||||||
|
if (bits < op) {
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
if (bits < op) {
|
||||||
|
hold += (unsigned long)(*in++) << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dist += (unsigned)hold & ((1U << op) - 1);
|
||||||
|
#ifdef INFLATE_STRICT
|
||||||
|
if (dist > dmax) {
|
||||||
|
strm->msg = (char *)"invalid distance too far back";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
hold >>= op;
|
||||||
|
bits -= op;
|
||||||
|
Tracevv((stderr, "inflate: distance %u\n", dist));
|
||||||
|
op = (unsigned)(out - beg); /* max distance in output */
|
||||||
|
if (dist > op) { /* see if copy from window */
|
||||||
|
op = dist - op; /* distance back in window */
|
||||||
|
if (op > whave) {
|
||||||
|
if (state->sane) {
|
||||||
|
strm->msg =
|
||||||
|
(char *)"invalid distance too far back";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
|
||||||
|
if (len <= op - whave) {
|
||||||
|
do {
|
||||||
|
*out++ = 0;
|
||||||
|
} while (--len);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
len -= op - whave;
|
||||||
|
do {
|
||||||
|
*out++ = 0;
|
||||||
|
} while (--op > whave);
|
||||||
|
if (op == 0) {
|
||||||
|
from = out - dist;
|
||||||
|
do {
|
||||||
|
*out++ = *from++;
|
||||||
|
} while (--len);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
from = window;
|
||||||
|
if (wnext == 0) { /* very common case */
|
||||||
|
from += wsize - op;
|
||||||
|
if (op < len) { /* some from window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
*out++ = *from++;
|
||||||
|
} while (--op);
|
||||||
|
from = out - dist; /* rest from output */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (wnext < op) { /* wrap around window */
|
||||||
|
from += wsize + wnext - op;
|
||||||
|
op -= wnext;
|
||||||
|
if (op < len) { /* some from end of window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
*out++ = *from++;
|
||||||
|
} while (--op);
|
||||||
|
from = window;
|
||||||
|
if (wnext < len) { /* some from start of window */
|
||||||
|
op = wnext;
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
*out++ = *from++;
|
||||||
|
} while (--op);
|
||||||
|
from = out - dist; /* rest from output */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { /* contiguous in window */
|
||||||
|
from += wnext - op;
|
||||||
|
if (op < len) { /* some from window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
*out++ = *from++;
|
||||||
|
} while (--op);
|
||||||
|
from = out - dist; /* rest from output */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (len > 2) {
|
||||||
|
*out++ = *from++;
|
||||||
|
*out++ = *from++;
|
||||||
|
*out++ = *from++;
|
||||||
|
len -= 3;
|
||||||
|
}
|
||||||
|
if (len) {
|
||||||
|
*out++ = *from++;
|
||||||
|
if (len > 1)
|
||||||
|
*out++ = *from++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
from = out - dist; /* copy direct from output */
|
||||||
|
do { /* minimum length is three */
|
||||||
|
*out++ = *from++;
|
||||||
|
*out++ = *from++;
|
||||||
|
*out++ = *from++;
|
||||||
|
len -= 3;
|
||||||
|
} while (len > 2);
|
||||||
|
if (len) {
|
||||||
|
*out++ = *from++;
|
||||||
|
if (len > 1)
|
||||||
|
*out++ = *from++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((op & 64) == 0) { /* 2nd level distance code */
|
||||||
|
here = dcode[here.val + (hold & ((1U << op) - 1))];
|
||||||
|
goto dodist;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strm->msg = (char *)"invalid distance code";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((op & 64) == 0) { /* 2nd level length code */
|
||||||
|
here = lcode[here.val + (hold & ((1U << op) - 1))];
|
||||||
|
goto dolen;
|
||||||
|
}
|
||||||
|
else if (op & 32) { /* end-of-block */
|
||||||
|
Tracevv((stderr, "inflate: end of block\n"));
|
||||||
|
state->mode = TYPE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strm->msg = (char *)"invalid literal/length code";
|
||||||
|
state->mode = BAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (in < last && out < end);
|
||||||
|
|
||||||
|
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
||||||
|
len = bits >> 3;
|
||||||
|
in -= len;
|
||||||
|
bits -= len << 3;
|
||||||
|
hold &= (1U << bits) - 1;
|
||||||
|
|
||||||
|
/* update state and return */
|
||||||
|
strm->next_in = in;
|
||||||
|
strm->next_out = out;
|
||||||
|
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
|
||||||
|
strm->avail_out = (unsigned)(out < end ?
|
||||||
|
257 + (end - out) : 257 - (out - end));
|
||||||
|
state->hold = hold;
|
||||||
|
state->bits = bits;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
|
||||||
|
- Using bit fields for code structure
|
||||||
|
- Different op definition to avoid & for extra bits (do & for table bits)
|
||||||
|
- Three separate decoding do-loops for direct, window, and wnext == 0
|
||||||
|
- Special case for distance > 1 copies to do overlapped load and store copy
|
||||||
|
- Explicit branch predictions (based on measured branch probabilities)
|
||||||
|
- Deferring match copy and interspersed it with decoding subsequent codes
|
||||||
|
- Swapping literal/length else
|
||||||
|
- Swapping window/direct else
|
||||||
|
- Larger unrolled copy loops (three is about right)
|
||||||
|
- Moving len -= 3 statement into middle of loop
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* !ASMINF */
|
11
PdbChecker/zlib/inffast.h
Normal file
11
PdbChecker/zlib/inffast.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* inffast.h -- header to use inffast.c
|
||||||
|
* Copyright (C) 1995-2003, 2010 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
|
94
PdbChecker/zlib/inffixed.h
Normal file
94
PdbChecker/zlib/inffixed.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* inffixed.h -- table for decoding fixed codes
|
||||||
|
* Generated automatically by makefixed().
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications.
|
||||||
|
It is part of the implementation of this library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const code lenfix[512] = {
|
||||||
|
{96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
|
||||||
|
{0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
|
||||||
|
{0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
|
||||||
|
{0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
|
||||||
|
{0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
|
||||||
|
{21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
|
||||||
|
{0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
|
||||||
|
{0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
|
||||||
|
{18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
|
||||||
|
{0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
|
||||||
|
{0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
|
||||||
|
{0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
|
||||||
|
{20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
|
||||||
|
{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
|
||||||
|
{0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
|
||||||
|
{0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
|
||||||
|
{16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
|
||||||
|
{0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
|
||||||
|
{0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
|
||||||
|
{0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
|
||||||
|
{0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
|
||||||
|
{0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
|
||||||
|
{0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
|
||||||
|
{0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
|
||||||
|
{17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
|
||||||
|
{0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
|
||||||
|
{0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
|
||||||
|
{0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
|
||||||
|
{19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
|
||||||
|
{0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
|
||||||
|
{0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
|
||||||
|
{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
|
||||||
|
{16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
|
||||||
|
{0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
|
||||||
|
{0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
|
||||||
|
{0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
|
||||||
|
{0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
|
||||||
|
{20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
|
||||||
|
{0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
|
||||||
|
{0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
|
||||||
|
{17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
|
||||||
|
{0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
|
||||||
|
{0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
|
||||||
|
{0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
|
||||||
|
{20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
|
||||||
|
{0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
|
||||||
|
{0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
|
||||||
|
{0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
|
||||||
|
{16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
|
||||||
|
{0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
|
||||||
|
{0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
|
||||||
|
{0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
|
||||||
|
{0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
|
||||||
|
{0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
|
||||||
|
{0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
|
||||||
|
{0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
|
||||||
|
{16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
|
||||||
|
{0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
|
||||||
|
{0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
|
||||||
|
{0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
|
||||||
|
{19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
|
||||||
|
{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
|
||||||
|
{0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
|
||||||
|
{0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
|
||||||
|
{16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
|
||||||
|
{0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
|
||||||
|
{0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
|
||||||
|
{0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
|
||||||
|
{0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
|
||||||
|
{64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
|
||||||
|
{0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
|
||||||
|
{0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
|
||||||
|
{18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
|
||||||
|
{0,9,255}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const code distfix[32] = {
|
||||||
|
{16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
|
||||||
|
{21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
|
||||||
|
{18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
|
||||||
|
{19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
|
||||||
|
{16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
|
||||||
|
{22,5,193},{64,5,0}
|
||||||
|
};
|
1561
PdbChecker/zlib/inflate.c
Normal file
1561
PdbChecker/zlib/inflate.c
Normal file
File diff suppressed because it is too large
Load Diff
125
PdbChecker/zlib/inflate.h
Normal file
125
PdbChecker/zlib/inflate.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/* inflate.h -- internal inflate state definition
|
||||||
|
* Copyright (C) 1995-2016 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* define NO_GZIP when compiling if you want to disable gzip header and
|
||||||
|
trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
|
||||||
|
the crc code when it is not needed. For shared libraries, gzip decoding
|
||||||
|
should be left enabled. */
|
||||||
|
#ifndef NO_GZIP
|
||||||
|
# define GUNZIP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Possible inflate modes between inflate() calls */
|
||||||
|
typedef enum {
|
||||||
|
HEAD = 16180, /* i: waiting for magic header */
|
||||||
|
FLAGS, /* i: waiting for method and flags (gzip) */
|
||||||
|
TIME, /* i: waiting for modification time (gzip) */
|
||||||
|
OS, /* i: waiting for extra flags and operating system (gzip) */
|
||||||
|
EXLEN, /* i: waiting for extra length (gzip) */
|
||||||
|
EXTRA, /* i: waiting for extra bytes (gzip) */
|
||||||
|
NAME, /* i: waiting for end of file name (gzip) */
|
||||||
|
COMMENT, /* i: waiting for end of comment (gzip) */
|
||||||
|
HCRC, /* i: waiting for header crc (gzip) */
|
||||||
|
DICTID, /* i: waiting for dictionary check value */
|
||||||
|
DICT, /* waiting for inflateSetDictionary() call */
|
||||||
|
TYPE, /* i: waiting for type bits, including last-flag bit */
|
||||||
|
TYPEDO, /* i: same, but skip check to exit inflate on new block */
|
||||||
|
STORED, /* i: waiting for stored size (length and complement) */
|
||||||
|
COPY_, /* i/o: same as COPY below, but only first time in */
|
||||||
|
COPY, /* i/o: waiting for input or output to copy stored block */
|
||||||
|
TABLE, /* i: waiting for dynamic block table lengths */
|
||||||
|
LENLENS, /* i: waiting for code length code lengths */
|
||||||
|
CODELENS, /* i: waiting for length/lit and distance code lengths */
|
||||||
|
LEN_, /* i: same as LEN below, but only first time in */
|
||||||
|
LEN, /* i: waiting for length/lit/eob code */
|
||||||
|
LENEXT, /* i: waiting for length extra bits */
|
||||||
|
DIST, /* i: waiting for distance code */
|
||||||
|
DISTEXT, /* i: waiting for distance extra bits */
|
||||||
|
MATCH, /* o: waiting for output space to copy string */
|
||||||
|
LIT, /* o: waiting for output space to write literal */
|
||||||
|
CHECK, /* i: waiting for 32-bit check value */
|
||||||
|
LENGTH, /* i: waiting for 32-bit length (gzip) */
|
||||||
|
DONE, /* finished check, done -- remain here until reset */
|
||||||
|
BAD, /* got a data error -- remain here until reset */
|
||||||
|
MEM, /* got an inflate() memory error -- remain here until reset */
|
||||||
|
SYNC /* looking for synchronization bytes to restart inflate() */
|
||||||
|
} inflate_mode;
|
||||||
|
|
||||||
|
/*
|
||||||
|
State transitions between above modes -
|
||||||
|
|
||||||
|
(most modes can go to BAD or MEM on error -- not shown for clarity)
|
||||||
|
|
||||||
|
Process header:
|
||||||
|
HEAD -> (gzip) or (zlib) or (raw)
|
||||||
|
(gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
|
||||||
|
HCRC -> TYPE
|
||||||
|
(zlib) -> DICTID or TYPE
|
||||||
|
DICTID -> DICT -> TYPE
|
||||||
|
(raw) -> TYPEDO
|
||||||
|
Read deflate blocks:
|
||||||
|
TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
|
||||||
|
STORED -> COPY_ -> COPY -> TYPE
|
||||||
|
TABLE -> LENLENS -> CODELENS -> LEN_
|
||||||
|
LEN_ -> LEN
|
||||||
|
Read deflate codes in fixed or dynamic block:
|
||||||
|
LEN -> LENEXT or LIT or TYPE
|
||||||
|
LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
|
||||||
|
LIT -> LEN
|
||||||
|
Process trailer:
|
||||||
|
CHECK -> LENGTH -> DONE
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* State maintained between inflate() calls -- approximately 7K bytes, not
|
||||||
|
including the allocated sliding window, which is up to 32K bytes. */
|
||||||
|
struct inflate_state {
|
||||||
|
z_streamp strm; /* pointer back to this zlib stream */
|
||||||
|
inflate_mode mode; /* current inflate mode */
|
||||||
|
int last; /* true if processing last block */
|
||||||
|
int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
|
||||||
|
bit 2 true to validate check value */
|
||||||
|
int havedict; /* true if dictionary provided */
|
||||||
|
int flags; /* gzip header method and flags (0 if zlib) */
|
||||||
|
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
|
||||||
|
unsigned long check; /* protected copy of check value */
|
||||||
|
unsigned long total; /* protected copy of output count */
|
||||||
|
gz_headerp head; /* where to save gzip header information */
|
||||||
|
/* sliding window */
|
||||||
|
unsigned wbits; /* log base 2 of requested window size */
|
||||||
|
unsigned wsize; /* window size or zero if not using window */
|
||||||
|
unsigned whave; /* valid bytes in the window */
|
||||||
|
unsigned wnext; /* window write index */
|
||||||
|
unsigned char FAR *window; /* allocated sliding window, if needed */
|
||||||
|
/* bit accumulator */
|
||||||
|
unsigned long hold; /* input bit accumulator */
|
||||||
|
unsigned bits; /* number of bits in "in" */
|
||||||
|
/* for string and stored block copying */
|
||||||
|
unsigned length; /* literal or length of data to copy */
|
||||||
|
unsigned offset; /* distance back to copy string from */
|
||||||
|
/* for table and code decoding */
|
||||||
|
unsigned extra; /* extra bits needed */
|
||||||
|
/* fixed and dynamic code tables */
|
||||||
|
code const FAR *lencode; /* starting table for length/literal codes */
|
||||||
|
code const FAR *distcode; /* starting table for distance codes */
|
||||||
|
unsigned lenbits; /* index bits for lencode */
|
||||||
|
unsigned distbits; /* index bits for distcode */
|
||||||
|
/* dynamic table building */
|
||||||
|
unsigned ncode; /* number of code length code lengths */
|
||||||
|
unsigned nlen; /* number of length code lengths */
|
||||||
|
unsigned ndist; /* number of distance code lengths */
|
||||||
|
unsigned have; /* number of code lengths in lens[] */
|
||||||
|
code FAR *next; /* next available space in codes[] */
|
||||||
|
unsigned short lens[320]; /* temporary storage for code lengths */
|
||||||
|
unsigned short work[288]; /* work area for code table building */
|
||||||
|
code codes[ENOUGH]; /* space for code tables */
|
||||||
|
int sane; /* if false, allow invalid distance too far */
|
||||||
|
int back; /* bits back of last unprocessed length/lit */
|
||||||
|
unsigned was; /* initial length of match */
|
||||||
|
};
|
304
PdbChecker/zlib/inftrees.c
Normal file
304
PdbChecker/zlib/inftrees.c
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
/* inftrees.c -- generate Huffman trees for efficient decoding
|
||||||
|
* Copyright (C) 1995-2017 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
#include "inftrees.h"
|
||||||
|
|
||||||
|
#define MAXBITS 15
|
||||||
|
|
||||||
|
const char inflate_copyright[] =
|
||||||
|
" inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
|
||||||
|
/*
|
||||||
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
|
in the documentation of your product. If for some reason you cannot
|
||||||
|
include such an acknowledgment, I would appreciate that you keep this
|
||||||
|
copyright string in the executable of your product.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Build a set of tables to decode the provided canonical Huffman code.
|
||||||
|
The code lengths are lens[0..codes-1]. The result starts at *table,
|
||||||
|
whose indices are 0..2^bits-1. work is a writable array of at least
|
||||||
|
lens shorts, which is used as a work area. type is the type of code
|
||||||
|
to be generated, CODES, LENS, or DISTS. On return, zero is success,
|
||||||
|
-1 is an invalid code, and +1 means that ENOUGH isn't enough. table
|
||||||
|
on return points to the next available entry's address. bits is the
|
||||||
|
requested root table index bits, and on return it is the actual root
|
||||||
|
table index bits. It will differ if the request is greater than the
|
||||||
|
longest code or if it is less than the shortest code.
|
||||||
|
*/
|
||||||
|
int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
|
||||||
|
codetype type;
|
||||||
|
unsigned short FAR *lens;
|
||||||
|
unsigned codes;
|
||||||
|
code FAR * FAR *table;
|
||||||
|
unsigned FAR *bits;
|
||||||
|
unsigned short FAR *work;
|
||||||
|
{
|
||||||
|
unsigned len; /* a code's length in bits */
|
||||||
|
unsigned sym; /* index of code symbols */
|
||||||
|
unsigned min, max; /* minimum and maximum code lengths */
|
||||||
|
unsigned root; /* number of index bits for root table */
|
||||||
|
unsigned curr; /* number of index bits for current table */
|
||||||
|
unsigned drop; /* code bits to drop for sub-table */
|
||||||
|
int left; /* number of prefix codes available */
|
||||||
|
unsigned used; /* code entries in table used */
|
||||||
|
unsigned huff; /* Huffman code */
|
||||||
|
unsigned incr; /* for incrementing code, index */
|
||||||
|
unsigned fill; /* index for replicating entries */
|
||||||
|
unsigned low; /* low bits for current root entry */
|
||||||
|
unsigned mask; /* mask for low root bits */
|
||||||
|
code here; /* table entry for duplication */
|
||||||
|
code FAR *next; /* next available space in table */
|
||||||
|
const unsigned short FAR *base; /* base value table to use */
|
||||||
|
const unsigned short FAR *extra; /* extra bits table to use */
|
||||||
|
unsigned match; /* use base and extra for symbol >= match */
|
||||||
|
unsigned short count[MAXBITS+1]; /* number of codes of each length */
|
||||||
|
unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
|
||||||
|
static const unsigned short lbase[31] = { /* Length codes 257..285 base */
|
||||||
|
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
||||||
|
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
|
||||||
|
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
||||||
|
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
||||||
|
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
|
||||||
|
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
|
||||||
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
||||||
|
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||||
|
8193, 12289, 16385, 24577, 0, 0};
|
||||||
|
static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
|
||||||
|
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
|
||||||
|
23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
|
||||||
|
28, 28, 29, 29, 64, 64};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Process a set of code lengths to create a canonical Huffman code. The
|
||||||
|
code lengths are lens[0..codes-1]. Each length corresponds to the
|
||||||
|
symbols 0..codes-1. The Huffman code is generated by first sorting the
|
||||||
|
symbols by length from short to long, and retaining the symbol order
|
||||||
|
for codes with equal lengths. Then the code starts with all zero bits
|
||||||
|
for the first code of the shortest length, and the codes are integer
|
||||||
|
increments for the same length, and zeros are appended as the length
|
||||||
|
increases. For the deflate format, these bits are stored backwards
|
||||||
|
from their more natural integer increment ordering, and so when the
|
||||||
|
decoding tables are built in the large loop below, the integer codes
|
||||||
|
are incremented backwards.
|
||||||
|
|
||||||
|
This routine assumes, but does not check, that all of the entries in
|
||||||
|
lens[] are in the range 0..MAXBITS. The caller must assure this.
|
||||||
|
1..MAXBITS is interpreted as that code length. zero means that that
|
||||||
|
symbol does not occur in this code.
|
||||||
|
|
||||||
|
The codes are sorted by computing a count of codes for each length,
|
||||||
|
creating from that a table of starting indices for each length in the
|
||||||
|
sorted table, and then entering the symbols in order in the sorted
|
||||||
|
table. The sorted table is work[], with that space being provided by
|
||||||
|
the caller.
|
||||||
|
|
||||||
|
The length counts are used for other purposes as well, i.e. finding
|
||||||
|
the minimum and maximum length codes, determining if there are any
|
||||||
|
codes at all, checking for a valid set of lengths, and looking ahead
|
||||||
|
at length counts to determine sub-table sizes when building the
|
||||||
|
decoding tables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
|
||||||
|
for (len = 0; len <= MAXBITS; len++)
|
||||||
|
count[len] = 0;
|
||||||
|
for (sym = 0; sym < codes; sym++)
|
||||||
|
count[lens[sym]]++;
|
||||||
|
|
||||||
|
/* bound code lengths, force root to be within code lengths */
|
||||||
|
root = *bits;
|
||||||
|
for (max = MAXBITS; max >= 1; max--)
|
||||||
|
if (count[max] != 0) break;
|
||||||
|
if (root > max) root = max;
|
||||||
|
if (max == 0) { /* no symbols to code at all */
|
||||||
|
here.op = (unsigned char)64; /* invalid code marker */
|
||||||
|
here.bits = (unsigned char)1;
|
||||||
|
here.val = (unsigned short)0;
|
||||||
|
*(*table)++ = here; /* make a table to force an error */
|
||||||
|
*(*table)++ = here;
|
||||||
|
*bits = 1;
|
||||||
|
return 0; /* no symbols, but wait for decoding to report error */
|
||||||
|
}
|
||||||
|
for (min = 1; min < max; min++)
|
||||||
|
if (count[min] != 0) break;
|
||||||
|
if (root < min) root = min;
|
||||||
|
|
||||||
|
/* check for an over-subscribed or incomplete set of lengths */
|
||||||
|
left = 1;
|
||||||
|
for (len = 1; len <= MAXBITS; len++) {
|
||||||
|
left <<= 1;
|
||||||
|
left -= count[len];
|
||||||
|
if (left < 0) return -1; /* over-subscribed */
|
||||||
|
}
|
||||||
|
if (left > 0 && (type == CODES || max != 1))
|
||||||
|
return -1; /* incomplete set */
|
||||||
|
|
||||||
|
/* generate offsets into symbol table for each length for sorting */
|
||||||
|
offs[1] = 0;
|
||||||
|
for (len = 1; len < MAXBITS; len++)
|
||||||
|
offs[len + 1] = offs[len] + count[len];
|
||||||
|
|
||||||
|
/* sort symbols by length, by symbol order within each length */
|
||||||
|
for (sym = 0; sym < codes; sym++)
|
||||||
|
if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Create and fill in decoding tables. In this loop, the table being
|
||||||
|
filled is at next and has curr index bits. The code being used is huff
|
||||||
|
with length len. That code is converted to an index by dropping drop
|
||||||
|
bits off of the bottom. For codes where len is less than drop + curr,
|
||||||
|
those top drop + curr - len bits are incremented through all values to
|
||||||
|
fill the table with replicated entries.
|
||||||
|
|
||||||
|
root is the number of index bits for the root table. When len exceeds
|
||||||
|
root, sub-tables are created pointed to by the root entry with an index
|
||||||
|
of the low root bits of huff. This is saved in low to check for when a
|
||||||
|
new sub-table should be started. drop is zero when the root table is
|
||||||
|
being filled, and drop is root when sub-tables are being filled.
|
||||||
|
|
||||||
|
When a new sub-table is needed, it is necessary to look ahead in the
|
||||||
|
code lengths to determine what size sub-table is needed. The length
|
||||||
|
counts are used for this, and so count[] is decremented as codes are
|
||||||
|
entered in the tables.
|
||||||
|
|
||||||
|
used keeps track of how many table entries have been allocated from the
|
||||||
|
provided *table space. It is checked for LENS and DIST tables against
|
||||||
|
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
|
||||||
|
the initial root table size constants. See the comments in inftrees.h
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
sym increments through all symbols, and the loop terminates when
|
||||||
|
all codes of length max, i.e. all codes, have been processed. This
|
||||||
|
routine permits incomplete codes, so another loop after this one fills
|
||||||
|
in the rest of the decoding tables with invalid code markers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set up for code type */
|
||||||
|
switch (type) {
|
||||||
|
case CODES:
|
||||||
|
base = extra = work; /* dummy value--not used */
|
||||||
|
match = 20;
|
||||||
|
break;
|
||||||
|
case LENS:
|
||||||
|
base = lbase;
|
||||||
|
extra = lext;
|
||||||
|
match = 257;
|
||||||
|
break;
|
||||||
|
default: /* DISTS */
|
||||||
|
base = dbase;
|
||||||
|
extra = dext;
|
||||||
|
match = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize state for loop */
|
||||||
|
huff = 0; /* starting code */
|
||||||
|
sym = 0; /* starting code symbol */
|
||||||
|
len = min; /* starting code length */
|
||||||
|
next = *table; /* current table to fill in */
|
||||||
|
curr = root; /* current table index bits */
|
||||||
|
drop = 0; /* current bits to drop from code for index */
|
||||||
|
low = (unsigned)(-1); /* trigger new sub-table when len > root */
|
||||||
|
used = 1U << root; /* use root table entries */
|
||||||
|
mask = used - 1; /* mask for comparing low */
|
||||||
|
|
||||||
|
/* check available table space */
|
||||||
|
if ((type == LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type == DISTS && used > ENOUGH_DISTS))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* process all codes and make table entries */
|
||||||
|
for (;;) {
|
||||||
|
/* create table entry */
|
||||||
|
here.bits = (unsigned char)(len - drop);
|
||||||
|
if (work[sym] + 1U < match) {
|
||||||
|
here.op = (unsigned char)0;
|
||||||
|
here.val = work[sym];
|
||||||
|
}
|
||||||
|
else if (work[sym] >= match) {
|
||||||
|
here.op = (unsigned char)(extra[work[sym] - match]);
|
||||||
|
here.val = base[work[sym] - match];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
here.op = (unsigned char)(32 + 64); /* end of block */
|
||||||
|
here.val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replicate for those indices with low len bits equal to huff */
|
||||||
|
incr = 1U << (len - drop);
|
||||||
|
fill = 1U << curr;
|
||||||
|
min = fill; /* save offset to next table */
|
||||||
|
do {
|
||||||
|
fill -= incr;
|
||||||
|
next[(huff >> drop) + fill] = here;
|
||||||
|
} while (fill != 0);
|
||||||
|
|
||||||
|
/* backwards increment the len-bit code huff */
|
||||||
|
incr = 1U << (len - 1);
|
||||||
|
while (huff & incr)
|
||||||
|
incr >>= 1;
|
||||||
|
if (incr != 0) {
|
||||||
|
huff &= incr - 1;
|
||||||
|
huff += incr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
huff = 0;
|
||||||
|
|
||||||
|
/* go to next symbol, update count, len */
|
||||||
|
sym++;
|
||||||
|
if (--(count[len]) == 0) {
|
||||||
|
if (len == max) break;
|
||||||
|
len = lens[work[sym]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create new sub-table if needed */
|
||||||
|
if (len > root && (huff & mask) != low) {
|
||||||
|
/* if first time, transition to sub-tables */
|
||||||
|
if (drop == 0)
|
||||||
|
drop = root;
|
||||||
|
|
||||||
|
/* increment past last table */
|
||||||
|
next += min; /* here min is 1 << curr */
|
||||||
|
|
||||||
|
/* determine length of next table */
|
||||||
|
curr = len - drop;
|
||||||
|
left = (int)(1 << curr);
|
||||||
|
while (curr + drop < max) {
|
||||||
|
left -= count[curr + drop];
|
||||||
|
if (left <= 0) break;
|
||||||
|
curr++;
|
||||||
|
left <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for enough space */
|
||||||
|
used += 1U << curr;
|
||||||
|
if ((type == LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type == DISTS && used > ENOUGH_DISTS))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* point entry in root table to sub-table */
|
||||||
|
low = huff & mask;
|
||||||
|
(*table)[low].op = (unsigned char)curr;
|
||||||
|
(*table)[low].bits = (unsigned char)root;
|
||||||
|
(*table)[low].val = (unsigned short)(next - *table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in remaining table entry if code is incomplete (guaranteed to have
|
||||||
|
at most one remaining entry, since if the code is incomplete, the
|
||||||
|
maximum code length that was allowed to get this far is one bit) */
|
||||||
|
if (huff != 0) {
|
||||||
|
here.op = (unsigned char)64; /* invalid code marker */
|
||||||
|
here.bits = (unsigned char)(len - drop);
|
||||||
|
here.val = (unsigned short)0;
|
||||||
|
next[huff] = here;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set return parameters */
|
||||||
|
*table += used;
|
||||||
|
*bits = root;
|
||||||
|
return 0;
|
||||||
|
}
|
62
PdbChecker/zlib/inftrees.h
Normal file
62
PdbChecker/zlib/inftrees.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* inftrees.h -- header to use inftrees.c
|
||||||
|
* Copyright (C) 1995-2005, 2010 Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Structure for decoding tables. Each entry provides either the
|
||||||
|
information needed to do the operation requested by the code that
|
||||||
|
indexed that table entry, or it provides a pointer to another
|
||||||
|
table that indexes more bits of the code. op indicates whether
|
||||||
|
the entry is a pointer to another table, a literal, a length or
|
||||||
|
distance, an end-of-block, or an invalid code. For a table
|
||||||
|
pointer, the low four bits of op is the number of index bits of
|
||||||
|
that table. For a length or distance, the low four bits of op
|
||||||
|
is the number of extra bits to get after the code. bits is
|
||||||
|
the number of bits in this code or part of the code to drop off
|
||||||
|
of the bit buffer. val is the actual byte to output in the case
|
||||||
|
of a literal, the base length or distance, or the offset from
|
||||||
|
the current table to the next table. Each entry is four bytes. */
|
||||||
|
typedef struct {
|
||||||
|
unsigned char op; /* operation, extra bits, table bits */
|
||||||
|
unsigned char bits; /* bits in this part of the code */
|
||||||
|
unsigned short val; /* offset in table or code value */
|
||||||
|
} code;
|
||||||
|
|
||||||
|
/* op values as set by inflate_table():
|
||||||
|
00000000 - literal
|
||||||
|
0000tttt - table link, tttt != 0 is the number of table index bits
|
||||||
|
0001eeee - length or distance, eeee is the number of extra bits
|
||||||
|
01100000 - end of block
|
||||||
|
01000000 - invalid code
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Maximum size of the dynamic table. The maximum number of code structures is
|
||||||
|
1444, which is the sum of 852 for literal/length codes and 592 for distance
|
||||||
|
codes. These values were found by exhaustive searches using the program
|
||||||
|
examples/enough.c found in the zlib distribtution. The arguments to that
|
||||||
|
program are the number of symbols, the initial root table size, and the
|
||||||
|
maximum bit length of a code. "enough 286 9 15" for literal/length codes
|
||||||
|
returns returns 852, and "enough 30 6 15" for distance codes returns 592.
|
||||||
|
The initial root table size (9 or 6) is found in the fifth argument of the
|
||||||
|
inflate_table() calls in inflate.c and infback.c. If the root table size is
|
||||||
|
changed, then these maximum sizes would be need to be recalculated and
|
||||||
|
updated. */
|
||||||
|
#define ENOUGH_LENS 852
|
||||||
|
#define ENOUGH_DISTS 592
|
||||||
|
#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
|
||||||
|
|
||||||
|
/* Type of code to build for inflate_table() */
|
||||||
|
typedef enum {
|
||||||
|
CODES,
|
||||||
|
LENS,
|
||||||
|
DISTS
|
||||||
|
} codetype;
|
||||||
|
|
||||||
|
int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
|
||||||
|
unsigned codes, code FAR * FAR *table,
|
||||||
|
unsigned FAR *bits, unsigned short FAR *work));
|
1203
PdbChecker/zlib/trees.c
Normal file
1203
PdbChecker/zlib/trees.c
Normal file
File diff suppressed because it is too large
Load Diff
128
PdbChecker/zlib/trees.h
Normal file
128
PdbChecker/zlib/trees.h
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
/* header created automatically with -DGEN_TREES_H */
|
||||||
|
|
||||||
|
local const ct_data static_ltree[L_CODES+2] = {
|
||||||
|
{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
|
||||||
|
{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
|
||||||
|
{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
|
||||||
|
{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
|
||||||
|
{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
|
||||||
|
{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
|
||||||
|
{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
|
||||||
|
{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
|
||||||
|
{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
|
||||||
|
{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
|
||||||
|
{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
|
||||||
|
{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
|
||||||
|
{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
|
||||||
|
{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
|
||||||
|
{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
|
||||||
|
{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
|
||||||
|
{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
|
||||||
|
{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
|
||||||
|
{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
|
||||||
|
{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
|
||||||
|
{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
|
||||||
|
{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
|
||||||
|
{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
|
||||||
|
{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
|
||||||
|
{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
|
||||||
|
{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
|
||||||
|
{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
|
||||||
|
{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
|
||||||
|
{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
|
||||||
|
{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
|
||||||
|
{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
|
||||||
|
{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
|
||||||
|
{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
|
||||||
|
{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
|
||||||
|
{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
|
||||||
|
{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
|
||||||
|
{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
|
||||||
|
{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
|
||||||
|
{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
|
||||||
|
{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
|
||||||
|
{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
|
||||||
|
{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
|
||||||
|
{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
|
||||||
|
{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
|
||||||
|
{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
|
||||||
|
{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
|
||||||
|
{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
|
||||||
|
{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
|
||||||
|
{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
|
||||||
|
{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
|
||||||
|
{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
|
||||||
|
{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
|
||||||
|
{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
|
||||||
|
{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
|
||||||
|
{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
|
||||||
|
{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
|
||||||
|
{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
|
||||||
|
{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
|
||||||
|
};
|
||||||
|
|
||||||
|
local const ct_data static_dtree[D_CODES] = {
|
||||||
|
{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
|
||||||
|
{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
|
||||||
|
{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
|
||||||
|
{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
|
||||||
|
{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
|
||||||
|
{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
|
||||||
|
};
|
||||||
|
|
||||||
|
const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
|
||||||
|
0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
|
||||||
|
8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
|
||||||
|
10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
|
||||||
|
11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
|
||||||
|
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
|
||||||
|
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
||||||
|
13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
||||||
|
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
||||||
|
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
||||||
|
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
|
||||||
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
||||||
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
||||||
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
|
||||||
|
18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
|
||||||
|
23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
||||||
|
24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||||
|
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
|
||||||
|
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
|
||||||
|
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
||||||
|
27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||||
|
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||||
|
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
|
||||||
|
28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
||||||
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
||||||
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
|
||||||
|
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
|
||||||
|
};
|
||||||
|
|
||||||
|
const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
|
||||||
|
13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||||
|
17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
|
||||||
|
19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
|
||||||
|
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
|
||||||
|
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
|
||||||
|
23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
||||||
|
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
|
||||||
|
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
||||||
|
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
|
||||||
|
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
|
||||||
|
26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
||||||
|
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
|
||||||
|
};
|
||||||
|
|
||||||
|
local const int base_length[LENGTH_CODES] = {
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
|
||||||
|
64, 80, 96, 112, 128, 160, 192, 224, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
local const int base_dist[D_CODES] = {
|
||||||
|
0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
|
||||||
|
32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
|
||||||
|
1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
|
||||||
|
};
|
||||||
|
|
93
PdbChecker/zlib/uncompr.c
Normal file
93
PdbChecker/zlib/uncompr.c
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/* uncompr.c -- decompress a memory buffer
|
||||||
|
* Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#define ZLIB_INTERNAL
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
|
/* ===========================================================================
|
||||||
|
Decompresses the source buffer into the destination buffer. *sourceLen is
|
||||||
|
the byte length of the source buffer. Upon entry, *destLen is the total size
|
||||||
|
of the destination buffer, which must be large enough to hold the entire
|
||||||
|
uncompressed data. (The size of the uncompressed data must have been saved
|
||||||
|
previously by the compressor and transmitted to the decompressor by some
|
||||||
|
mechanism outside the scope of this compression library.) Upon exit,
|
||||||
|
*destLen is the size of the decompressed data and *sourceLen is the number
|
||||||
|
of source bytes consumed. Upon return, source + *sourceLen points to the
|
||||||
|
first unused input byte.
|
||||||
|
|
||||||
|
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
|
||||||
|
memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
|
||||||
|
Z_DATA_ERROR if the input data was corrupted, including if the input data is
|
||||||
|
an incomplete zlib stream.
|
||||||
|
*/
|
||||||
|
int ZEXPORT uncompress2 (dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong *sourceLen;
|
||||||
|
{
|
||||||
|
z_stream stream;
|
||||||
|
int err;
|
||||||
|
const uInt max = (uInt)-1;
|
||||||
|
uLong len, left;
|
||||||
|
Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
|
||||||
|
|
||||||
|
len = *sourceLen;
|
||||||
|
if (*destLen) {
|
||||||
|
left = *destLen;
|
||||||
|
*destLen = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
left = 1;
|
||||||
|
dest = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.next_in = (z_const Bytef *)source;
|
||||||
|
stream.avail_in = 0;
|
||||||
|
stream.zalloc = (alloc_func)0;
|
||||||
|
stream.zfree = (free_func)0;
|
||||||
|
stream.opaque = (voidpf)0;
|
||||||
|
|
||||||
|
err = inflateInit(&stream);
|
||||||
|
if (err != Z_OK) return err;
|
||||||
|
|
||||||
|
stream.next_out = dest;
|
||||||
|
stream.avail_out = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (stream.avail_out == 0) {
|
||||||
|
stream.avail_out = left > (uLong)max ? max : (uInt)left;
|
||||||
|
left -= stream.avail_out;
|
||||||
|
}
|
||||||
|
if (stream.avail_in == 0) {
|
||||||
|
stream.avail_in = len > (uLong)max ? max : (uInt)len;
|
||||||
|
len -= stream.avail_in;
|
||||||
|
}
|
||||||
|
err = inflate(&stream, Z_NO_FLUSH);
|
||||||
|
} while (err == Z_OK);
|
||||||
|
|
||||||
|
*sourceLen -= len + stream.avail_in;
|
||||||
|
if (dest != buf)
|
||||||
|
*destLen = stream.total_out;
|
||||||
|
else if (stream.total_out && err == Z_BUF_ERROR)
|
||||||
|
left = 1;
|
||||||
|
|
||||||
|
inflateEnd(&stream);
|
||||||
|
return err == Z_STREAM_END ? Z_OK :
|
||||||
|
err == Z_NEED_DICT ? Z_DATA_ERROR :
|
||||||
|
err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
|
||||||
|
err;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZEXPORT uncompress (dest, destLen, source, sourceLen)
|
||||||
|
Bytef *dest;
|
||||||
|
uLongf *destLen;
|
||||||
|
const Bytef *source;
|
||||||
|
uLong sourceLen;
|
||||||
|
{
|
||||||
|
return uncompress2(dest, destLen, source, &sourceLen);
|
||||||
|
}
|
534
PdbChecker/zlib/zconf.h
Normal file
534
PdbChecker/zlib/zconf.h
Normal file
@ -0,0 +1,534 @@
|
|||||||
|
/* zconf.h -- configuration of the zlib compression library
|
||||||
|
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef ZCONF_H
|
||||||
|
#define ZCONF_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you *really* need a unique prefix for all types and library functions,
|
||||||
|
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||||
|
* Even better than compiling with -DZ_PREFIX would be to use configure to set
|
||||||
|
* this permanently in zconf.h using "./configure --zprefix".
|
||||||
|
*/
|
||||||
|
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_PREFIX_SET
|
||||||
|
|
||||||
|
/* all linked symbols and init macros */
|
||||||
|
# define _dist_code z__dist_code
|
||||||
|
# define _length_code z__length_code
|
||||||
|
# define _tr_align z__tr_align
|
||||||
|
# define _tr_flush_bits z__tr_flush_bits
|
||||||
|
# define _tr_flush_block z__tr_flush_block
|
||||||
|
# define _tr_init z__tr_init
|
||||||
|
# define _tr_stored_block z__tr_stored_block
|
||||||
|
# define _tr_tally z__tr_tally
|
||||||
|
# define adler32 z_adler32
|
||||||
|
# define adler32_combine z_adler32_combine
|
||||||
|
# define adler32_combine64 z_adler32_combine64
|
||||||
|
# define adler32_z z_adler32_z
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define compress z_compress
|
||||||
|
# define compress2 z_compress2
|
||||||
|
# define compressBound z_compressBound
|
||||||
|
# endif
|
||||||
|
# define crc32 z_crc32
|
||||||
|
# define crc32_combine z_crc32_combine
|
||||||
|
# define crc32_combine64 z_crc32_combine64
|
||||||
|
# define crc32_z z_crc32_z
|
||||||
|
# define deflate z_deflate
|
||||||
|
# define deflateBound z_deflateBound
|
||||||
|
# define deflateCopy z_deflateCopy
|
||||||
|
# define deflateEnd z_deflateEnd
|
||||||
|
# define deflateGetDictionary z_deflateGetDictionary
|
||||||
|
# define deflateInit z_deflateInit
|
||||||
|
# define deflateInit2 z_deflateInit2
|
||||||
|
# define deflateInit2_ z_deflateInit2_
|
||||||
|
# define deflateInit_ z_deflateInit_
|
||||||
|
# define deflateParams z_deflateParams
|
||||||
|
# define deflatePending z_deflatePending
|
||||||
|
# define deflatePrime z_deflatePrime
|
||||||
|
# define deflateReset z_deflateReset
|
||||||
|
# define deflateResetKeep z_deflateResetKeep
|
||||||
|
# define deflateSetDictionary z_deflateSetDictionary
|
||||||
|
# define deflateSetHeader z_deflateSetHeader
|
||||||
|
# define deflateTune z_deflateTune
|
||||||
|
# define deflate_copyright z_deflate_copyright
|
||||||
|
# define get_crc_table z_get_crc_table
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define gz_error z_gz_error
|
||||||
|
# define gz_intmax z_gz_intmax
|
||||||
|
# define gz_strwinerror z_gz_strwinerror
|
||||||
|
# define gzbuffer z_gzbuffer
|
||||||
|
# define gzclearerr z_gzclearerr
|
||||||
|
# define gzclose z_gzclose
|
||||||
|
# define gzclose_r z_gzclose_r
|
||||||
|
# define gzclose_w z_gzclose_w
|
||||||
|
# define gzdirect z_gzdirect
|
||||||
|
# define gzdopen z_gzdopen
|
||||||
|
# define gzeof z_gzeof
|
||||||
|
# define gzerror z_gzerror
|
||||||
|
# define gzflush z_gzflush
|
||||||
|
# define gzfread z_gzfread
|
||||||
|
# define gzfwrite z_gzfwrite
|
||||||
|
# define gzgetc z_gzgetc
|
||||||
|
# define gzgetc_ z_gzgetc_
|
||||||
|
# define gzgets z_gzgets
|
||||||
|
# define gzoffset z_gzoffset
|
||||||
|
# define gzoffset64 z_gzoffset64
|
||||||
|
# define gzopen z_gzopen
|
||||||
|
# define gzopen64 z_gzopen64
|
||||||
|
# ifdef _WIN32
|
||||||
|
# define gzopen_w z_gzopen_w
|
||||||
|
# endif
|
||||||
|
# define gzprintf z_gzprintf
|
||||||
|
# define gzputc z_gzputc
|
||||||
|
# define gzputs z_gzputs
|
||||||
|
# define gzread z_gzread
|
||||||
|
# define gzrewind z_gzrewind
|
||||||
|
# define gzseek z_gzseek
|
||||||
|
# define gzseek64 z_gzseek64
|
||||||
|
# define gzsetparams z_gzsetparams
|
||||||
|
# define gztell z_gztell
|
||||||
|
# define gztell64 z_gztell64
|
||||||
|
# define gzungetc z_gzungetc
|
||||||
|
# define gzvprintf z_gzvprintf
|
||||||
|
# define gzwrite z_gzwrite
|
||||||
|
# endif
|
||||||
|
# define inflate z_inflate
|
||||||
|
# define inflateBack z_inflateBack
|
||||||
|
# define inflateBackEnd z_inflateBackEnd
|
||||||
|
# define inflateBackInit z_inflateBackInit
|
||||||
|
# define inflateBackInit_ z_inflateBackInit_
|
||||||
|
# define inflateCodesUsed z_inflateCodesUsed
|
||||||
|
# define inflateCopy z_inflateCopy
|
||||||
|
# define inflateEnd z_inflateEnd
|
||||||
|
# define inflateGetDictionary z_inflateGetDictionary
|
||||||
|
# define inflateGetHeader z_inflateGetHeader
|
||||||
|
# define inflateInit z_inflateInit
|
||||||
|
# define inflateInit2 z_inflateInit2
|
||||||
|
# define inflateInit2_ z_inflateInit2_
|
||||||
|
# define inflateInit_ z_inflateInit_
|
||||||
|
# define inflateMark z_inflateMark
|
||||||
|
# define inflatePrime z_inflatePrime
|
||||||
|
# define inflateReset z_inflateReset
|
||||||
|
# define inflateReset2 z_inflateReset2
|
||||||
|
# define inflateResetKeep z_inflateResetKeep
|
||||||
|
# define inflateSetDictionary z_inflateSetDictionary
|
||||||
|
# define inflateSync z_inflateSync
|
||||||
|
# define inflateSyncPoint z_inflateSyncPoint
|
||||||
|
# define inflateUndermine z_inflateUndermine
|
||||||
|
# define inflateValidate z_inflateValidate
|
||||||
|
# define inflate_copyright z_inflate_copyright
|
||||||
|
# define inflate_fast z_inflate_fast
|
||||||
|
# define inflate_table z_inflate_table
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define uncompress z_uncompress
|
||||||
|
# define uncompress2 z_uncompress2
|
||||||
|
# endif
|
||||||
|
# define zError z_zError
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define zcalloc z_zcalloc
|
||||||
|
# define zcfree z_zcfree
|
||||||
|
# endif
|
||||||
|
# define zlibCompileFlags z_zlibCompileFlags
|
||||||
|
# define zlibVersion z_zlibVersion
|
||||||
|
|
||||||
|
/* all zlib typedefs in zlib.h and zconf.h */
|
||||||
|
# define Byte z_Byte
|
||||||
|
# define Bytef z_Bytef
|
||||||
|
# define alloc_func z_alloc_func
|
||||||
|
# define charf z_charf
|
||||||
|
# define free_func z_free_func
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define gzFile z_gzFile
|
||||||
|
# endif
|
||||||
|
# define gz_header z_gz_header
|
||||||
|
# define gz_headerp z_gz_headerp
|
||||||
|
# define in_func z_in_func
|
||||||
|
# define intf z_intf
|
||||||
|
# define out_func z_out_func
|
||||||
|
# define uInt z_uInt
|
||||||
|
# define uIntf z_uIntf
|
||||||
|
# define uLong z_uLong
|
||||||
|
# define uLongf z_uLongf
|
||||||
|
# define voidp z_voidp
|
||||||
|
# define voidpc z_voidpc
|
||||||
|
# define voidpf z_voidpf
|
||||||
|
|
||||||
|
/* all zlib structs in zlib.h and zconf.h */
|
||||||
|
# define gz_header_s z_gz_header_s
|
||||||
|
# define internal_state z_internal_state
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||||
|
# define MSDOS
|
||||||
|
#endif
|
||||||
|
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||||
|
# define OS2
|
||||||
|
#endif
|
||||||
|
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||||
|
# define WINDOWS
|
||||||
|
#endif
|
||||||
|
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
||||||
|
# ifndef WIN32
|
||||||
|
# define WIN32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||||
|
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||||
|
# ifndef SYS16BIT
|
||||||
|
# define SYS16BIT
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||||
|
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# define MAXSEG_64K
|
||||||
|
#endif
|
||||||
|
#ifdef MSDOS
|
||||||
|
# define UNALIGNED_OK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC_VERSION__
|
||||||
|
# ifndef STDC
|
||||||
|
# define STDC
|
||||||
|
# endif
|
||||||
|
# if __STDC_VERSION__ >= 199901L
|
||||||
|
# ifndef STDC99
|
||||||
|
# define STDC99
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STDC
|
||||||
|
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||||
|
# define const /* note: need a more gentle solution here */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ZLIB_CONST) && !defined(z_const)
|
||||||
|
# define z_const const
|
||||||
|
#else
|
||||||
|
# define z_const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
typedef unsigned long z_size_t;
|
||||||
|
#else
|
||||||
|
# define z_longlong long long
|
||||||
|
# if defined(NO_SIZE_T)
|
||||||
|
typedef unsigned NO_SIZE_T z_size_t;
|
||||||
|
# elif defined(STDC)
|
||||||
|
# include <stddef.h>
|
||||||
|
typedef size_t z_size_t;
|
||||||
|
# else
|
||||||
|
typedef unsigned long z_size_t;
|
||||||
|
# endif
|
||||||
|
# undef z_longlong
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for memLevel in deflateInit2 */
|
||||||
|
#ifndef MAX_MEM_LEVEL
|
||||||
|
# ifdef MAXSEG_64K
|
||||||
|
# define MAX_MEM_LEVEL 8
|
||||||
|
# else
|
||||||
|
# define MAX_MEM_LEVEL 9
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||||
|
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||||
|
* created by gzip. (Files created by minigzip can still be extracted by
|
||||||
|
* gzip.)
|
||||||
|
*/
|
||||||
|
#ifndef MAX_WBITS
|
||||||
|
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The memory requirements for deflate are (in bytes):
|
||||||
|
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||||
|
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||||
|
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||||
|
the default memory requirements from 256K to 128K, compile with
|
||||||
|
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||||
|
Of course this will generally degrade compression (there's no free lunch).
|
||||||
|
|
||||||
|
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||||
|
that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
|
||||||
|
for small objects.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Type declarations */
|
||||||
|
|
||||||
|
#ifndef OF /* function prototypes */
|
||||||
|
# ifdef STDC
|
||||||
|
# define OF(args) args
|
||||||
|
# else
|
||||||
|
# define OF(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Z_ARG /* function prototypes for stdarg */
|
||||||
|
# if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||||
|
# define Z_ARG(args) args
|
||||||
|
# else
|
||||||
|
# define Z_ARG(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||||
|
* model programming (small or medium model with some far allocations).
|
||||||
|
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||||
|
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||||
|
* just define FAR to be empty.
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# if defined(M_I86SM) || defined(M_I86MM)
|
||||||
|
/* MSC small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||||
|
/* Turbo C small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef __BORLANDC__
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WINDOWS) || defined(WIN32)
|
||||||
|
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||||
|
* This is not mandatory, but it offers a little performance increase.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXTERN extern __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXTERN extern __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif /* ZLIB_DLL */
|
||||||
|
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||||
|
* define ZLIB_WINAPI.
|
||||||
|
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_WINAPI
|
||||||
|
# ifdef FAR
|
||||||
|
# undef FAR
|
||||||
|
# endif
|
||||||
|
# include <windows.h>
|
||||||
|
/* No need for _export, use ZLIB.DEF instead. */
|
||||||
|
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||||
|
# define ZEXPORT WINAPI
|
||||||
|
# ifdef WIN32
|
||||||
|
# define ZEXPORTVA WINAPIV
|
||||||
|
# else
|
||||||
|
# define ZEXPORTVA FAR CDECL
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__BEOS__)
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXPORT __declspec(dllexport)
|
||||||
|
# define ZEXPORTVA __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXPORT __declspec(dllimport)
|
||||||
|
# define ZEXPORTVA __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZEXTERN
|
||||||
|
# define ZEXTERN extern
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORT
|
||||||
|
# define ZEXPORT
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORTVA
|
||||||
|
# define ZEXPORTVA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FAR
|
||||||
|
# define FAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__MACTYPES__)
|
||||||
|
typedef unsigned char Byte; /* 8 bits */
|
||||||
|
#endif
|
||||||
|
typedef unsigned int uInt; /* 16 bits or more */
|
||||||
|
typedef unsigned long uLong; /* 32 bits or more */
|
||||||
|
|
||||||
|
#ifdef SMALL_MEDIUM
|
||||||
|
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||||
|
# define Bytef Byte FAR
|
||||||
|
#else
|
||||||
|
typedef Byte FAR Bytef;
|
||||||
|
#endif
|
||||||
|
typedef char FAR charf;
|
||||||
|
typedef int FAR intf;
|
||||||
|
typedef uInt FAR uIntf;
|
||||||
|
typedef uLong FAR uLongf;
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
typedef void const *voidpc;
|
||||||
|
typedef void FAR *voidpf;
|
||||||
|
typedef void *voidp;
|
||||||
|
#else
|
||||||
|
typedef Byte const *voidpc;
|
||||||
|
typedef Byte FAR *voidpf;
|
||||||
|
typedef Byte *voidp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
||||||
|
# include <limits.h>
|
||||||
|
# if (UINT_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned
|
||||||
|
# elif (ULONG_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned long
|
||||||
|
# elif (USHRT_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned short
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_U4
|
||||||
|
typedef Z_U4 z_crc_t;
|
||||||
|
#else
|
||||||
|
typedef unsigned long z_crc_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_HAVE_UNISTD_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_HAVE_STDARG_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <sys/types.h> /* for off_t */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <stdarg.h> /* for va_list */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <stddef.h> /* for wchar_t */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
||||||
|
* "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
|
||||||
|
* though the former does not conform to the LFS document), but considering
|
||||||
|
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||||
|
* equivalently requesting no 64-bit operations
|
||||||
|
*/
|
||||||
|
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||||
|
# undef _LARGEFILE64_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
|
||||||
|
# define Z_HAVE_UNISTD_H
|
||||||
|
#endif
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
|
||||||
|
# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
||||||
|
# ifdef VMS
|
||||||
|
# include <unixio.h> /* for off_t */
|
||||||
|
# endif
|
||||||
|
# ifndef z_off_t
|
||||||
|
# define z_off_t off_t
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
|
||||||
|
# define Z_LFS64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
|
||||||
|
# define Z_LARGE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
|
||||||
|
# define Z_WANT64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(SEEK_SET) && !defined(Z_SOLO)
|
||||||
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||||
|
# define SEEK_CUR 1 /* Seek from current position. */
|
||||||
|
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef z_off_t
|
||||||
|
# define z_off_t long
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(_WIN32) && defined(Z_LARGE64)
|
||||||
|
# define z_off64_t off64_t
|
||||||
|
#else
|
||||||
|
# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
|
||||||
|
# define z_off64_t __int64
|
||||||
|
# else
|
||||||
|
# define z_off64_t z_off_t
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MVS linker does not support external names larger than 8 bytes */
|
||||||
|
#if defined(__MVS__)
|
||||||
|
#pragma map(deflateInit_,"DEIN")
|
||||||
|
#pragma map(deflateInit2_,"DEIN2")
|
||||||
|
#pragma map(deflateEnd,"DEEND")
|
||||||
|
#pragma map(deflateBound,"DEBND")
|
||||||
|
#pragma map(inflateInit_,"ININ")
|
||||||
|
#pragma map(inflateInit2_,"ININ2")
|
||||||
|
#pragma map(inflateEnd,"INEND")
|
||||||
|
#pragma map(inflateSync,"INSY")
|
||||||
|
#pragma map(inflateSetDictionary,"INSEDI")
|
||||||
|
#pragma map(compressBound,"CMBND")
|
||||||
|
#pragma map(inflate_table,"INTABL")
|
||||||
|
#pragma map(inflate_fast,"INFA")
|
||||||
|
#pragma map(inflate_copyright,"INCOPY")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ZCONF_H */
|
1912
PdbChecker/zlib/zlib.h
Normal file
1912
PdbChecker/zlib/zlib.h
Normal file
File diff suppressed because it is too large
Load Diff
325
PdbChecker/zlib/zutil.c
Normal file
325
PdbChecker/zlib/zutil.c
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
/* zutil.c -- target dependent utility functions for the compression library
|
||||||
|
* Copyright (C) 1995-2017 Jean-loup Gailly
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#include "zutil.h"
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
# include "gzguts.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
z_const char * const z_errmsg[10] = {
|
||||||
|
(z_const char *)"need dictionary", /* Z_NEED_DICT 2 */
|
||||||
|
(z_const char *)"stream end", /* Z_STREAM_END 1 */
|
||||||
|
(z_const char *)"", /* Z_OK 0 */
|
||||||
|
(z_const char *)"file error", /* Z_ERRNO (-1) */
|
||||||
|
(z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */
|
||||||
|
(z_const char *)"data error", /* Z_DATA_ERROR (-3) */
|
||||||
|
(z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */
|
||||||
|
(z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */
|
||||||
|
(z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */
|
||||||
|
(z_const char *)""
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const char * ZEXPORT zlibVersion()
|
||||||
|
{
|
||||||
|
return ZLIB_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
uLong ZEXPORT zlibCompileFlags()
|
||||||
|
{
|
||||||
|
uLong flags;
|
||||||
|
|
||||||
|
flags = 0;
|
||||||
|
switch ((int)(sizeof(uInt))) {
|
||||||
|
case 2: break;
|
||||||
|
case 4: flags += 1; break;
|
||||||
|
case 8: flags += 2; break;
|
||||||
|
default: flags += 3;
|
||||||
|
}
|
||||||
|
switch ((int)(sizeof(uLong))) {
|
||||||
|
case 2: break;
|
||||||
|
case 4: flags += 1 << 2; break;
|
||||||
|
case 8: flags += 2 << 2; break;
|
||||||
|
default: flags += 3 << 2;
|
||||||
|
}
|
||||||
|
switch ((int)(sizeof(voidpf))) {
|
||||||
|
case 2: break;
|
||||||
|
case 4: flags += 1 << 4; break;
|
||||||
|
case 8: flags += 2 << 4; break;
|
||||||
|
default: flags += 3 << 4;
|
||||||
|
}
|
||||||
|
switch ((int)(sizeof(z_off_t))) {
|
||||||
|
case 2: break;
|
||||||
|
case 4: flags += 1 << 6; break;
|
||||||
|
case 8: flags += 2 << 6; break;
|
||||||
|
default: flags += 3 << 6;
|
||||||
|
}
|
||||||
|
#ifdef ZLIB_DEBUG
|
||||||
|
flags += 1 << 8;
|
||||||
|
#endif
|
||||||
|
#if defined(ASMV) || defined(ASMINF)
|
||||||
|
flags += 1 << 9;
|
||||||
|
#endif
|
||||||
|
#ifdef ZLIB_WINAPI
|
||||||
|
flags += 1 << 10;
|
||||||
|
#endif
|
||||||
|
#ifdef BUILDFIXED
|
||||||
|
flags += 1 << 12;
|
||||||
|
#endif
|
||||||
|
#ifdef DYNAMIC_CRC_TABLE
|
||||||
|
flags += 1 << 13;
|
||||||
|
#endif
|
||||||
|
#ifdef NO_GZCOMPRESS
|
||||||
|
flags += 1L << 16;
|
||||||
|
#endif
|
||||||
|
#ifdef NO_GZIP
|
||||||
|
flags += 1L << 17;
|
||||||
|
#endif
|
||||||
|
#ifdef PKZIP_BUG_WORKAROUND
|
||||||
|
flags += 1L << 20;
|
||||||
|
#endif
|
||||||
|
#ifdef FASTEST
|
||||||
|
flags += 1L << 21;
|
||||||
|
#endif
|
||||||
|
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||||
|
# ifdef NO_vsnprintf
|
||||||
|
flags += 1L << 25;
|
||||||
|
# ifdef HAS_vsprintf_void
|
||||||
|
flags += 1L << 26;
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# ifdef HAS_vsnprintf_void
|
||||||
|
flags += 1L << 26;
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
flags += 1L << 24;
|
||||||
|
# ifdef NO_snprintf
|
||||||
|
flags += 1L << 25;
|
||||||
|
# ifdef HAS_sprintf_void
|
||||||
|
flags += 1L << 26;
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# ifdef HAS_snprintf_void
|
||||||
|
flags += 1L << 26;
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ZLIB_DEBUG
|
||||||
|
#include <stdlib.h>
|
||||||
|
# ifndef verbose
|
||||||
|
# define verbose 0
|
||||||
|
# endif
|
||||||
|
int ZLIB_INTERNAL z_verbose = verbose;
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL z_error (m)
|
||||||
|
char *m;
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s\n", m);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* exported to allow conversion of error code to string for compress() and
|
||||||
|
* uncompress()
|
||||||
|
*/
|
||||||
|
const char * ZEXPORT zError(err)
|
||||||
|
int err;
|
||||||
|
{
|
||||||
|
return ERR_MSG(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32_WCE)
|
||||||
|
/* The Microsoft C Run-Time Library for Windows CE doesn't have
|
||||||
|
* errno. We define it as a global variable to simplify porting.
|
||||||
|
* Its value is always 0 and should not be used.
|
||||||
|
*/
|
||||||
|
int errno = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_MEMCPY
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL zmemcpy(dest, source, len)
|
||||||
|
Bytef* dest;
|
||||||
|
const Bytef* source;
|
||||||
|
uInt len;
|
||||||
|
{
|
||||||
|
if (len == 0) return;
|
||||||
|
do {
|
||||||
|
*dest++ = *source++; /* ??? to be unrolled */
|
||||||
|
} while (--len != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZLIB_INTERNAL zmemcmp(s1, s2, len)
|
||||||
|
const Bytef* s1;
|
||||||
|
const Bytef* s2;
|
||||||
|
uInt len;
|
||||||
|
{
|
||||||
|
uInt j;
|
||||||
|
|
||||||
|
for (j = 0; j < len; j++) {
|
||||||
|
if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL zmemzero(dest, len)
|
||||||
|
Bytef* dest;
|
||||||
|
uInt len;
|
||||||
|
{
|
||||||
|
if (len == 0) return;
|
||||||
|
do {
|
||||||
|
*dest++ = 0; /* ??? to be unrolled */
|
||||||
|
} while (--len != 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
|
||||||
|
#ifdef __TURBOC__
|
||||||
|
/* Turbo C in 16-bit mode */
|
||||||
|
|
||||||
|
# define MY_ZCALLOC
|
||||||
|
|
||||||
|
/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
|
||||||
|
* and farmalloc(64K) returns a pointer with an offset of 8, so we
|
||||||
|
* must fix the pointer. Warning: the pointer must be put back to its
|
||||||
|
* original form in order to free it, use zcfree().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MAX_PTR 10
|
||||||
|
/* 10*64K = 640K */
|
||||||
|
|
||||||
|
local int next_ptr = 0;
|
||||||
|
|
||||||
|
typedef struct ptr_table_s {
|
||||||
|
voidpf org_ptr;
|
||||||
|
voidpf new_ptr;
|
||||||
|
} ptr_table;
|
||||||
|
|
||||||
|
local ptr_table table[MAX_PTR];
|
||||||
|
/* This table is used to remember the original form of pointers
|
||||||
|
* to large buffers (64K). Such pointers are normalized with a zero offset.
|
||||||
|
* Since MSDOS is not a preemptive multitasking OS, this table is not
|
||||||
|
* protected from concurrent access. This hack doesn't work anyway on
|
||||||
|
* a protected system like OS/2. Use Microsoft C instead.
|
||||||
|
*/
|
||||||
|
|
||||||
|
voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
|
||||||
|
{
|
||||||
|
voidpf buf;
|
||||||
|
ulg bsize = (ulg)items*size;
|
||||||
|
|
||||||
|
(void)opaque;
|
||||||
|
|
||||||
|
/* If we allocate less than 65520 bytes, we assume that farmalloc
|
||||||
|
* will return a usable pointer which doesn't have to be normalized.
|
||||||
|
*/
|
||||||
|
if (bsize < 65520L) {
|
||||||
|
buf = farmalloc(bsize);
|
||||||
|
if (*(ush*)&buf != 0) return buf;
|
||||||
|
} else {
|
||||||
|
buf = farmalloc(bsize + 16L);
|
||||||
|
}
|
||||||
|
if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
|
||||||
|
table[next_ptr].org_ptr = buf;
|
||||||
|
|
||||||
|
/* Normalize the pointer to seg:0 */
|
||||||
|
*((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
|
||||||
|
*(ush*)&buf = 0;
|
||||||
|
table[next_ptr++].new_ptr = buf;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
(void)opaque;
|
||||||
|
|
||||||
|
if (*(ush*)&ptr != 0) { /* object < 64K */
|
||||||
|
farfree(ptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Find the original pointer */
|
||||||
|
for (n = 0; n < next_ptr; n++) {
|
||||||
|
if (ptr != table[n].new_ptr) continue;
|
||||||
|
|
||||||
|
farfree(table[n].org_ptr);
|
||||||
|
while (++n < next_ptr) {
|
||||||
|
table[n-1] = table[n];
|
||||||
|
}
|
||||||
|
next_ptr--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Assert(0, "zcfree: ptr not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __TURBOC__ */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef M_I86
|
||||||
|
/* Microsoft C in 16-bit mode */
|
||||||
|
|
||||||
|
# define MY_ZCALLOC
|
||||||
|
|
||||||
|
#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
|
||||||
|
# define _halloc halloc
|
||||||
|
# define _hfree hfree
|
||||||
|
#endif
|
||||||
|
|
||||||
|
voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
|
||||||
|
{
|
||||||
|
(void)opaque;
|
||||||
|
return _halloc((long)items, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
|
||||||
|
{
|
||||||
|
(void)opaque;
|
||||||
|
_hfree(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* M_I86 */
|
||||||
|
|
||||||
|
#endif /* SYS16BIT */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MY_ZCALLOC /* Any system without a special alloc function */
|
||||||
|
|
||||||
|
#ifndef STDC
|
||||||
|
extern voidp malloc OF((uInt size));
|
||||||
|
extern voidp calloc OF((uInt items, uInt size));
|
||||||
|
extern void free OF((voidpf ptr));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
|
||||||
|
voidpf opaque;
|
||||||
|
unsigned items;
|
||||||
|
unsigned size;
|
||||||
|
{
|
||||||
|
(void)opaque;
|
||||||
|
return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
|
||||||
|
(voidpf)calloc(items, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZLIB_INTERNAL zcfree (opaque, ptr)
|
||||||
|
voidpf opaque;
|
||||||
|
voidpf ptr;
|
||||||
|
{
|
||||||
|
(void)opaque;
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MY_ZCALLOC */
|
||||||
|
|
||||||
|
#endif /* !Z_SOLO */
|
271
PdbChecker/zlib/zutil.h
Normal file
271
PdbChecker/zlib/zutil.h
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
/* zutil.h -- internal interface and configuration of the compression library
|
||||||
|
* Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WARNING: this file should *not* be used by applications. It is
|
||||||
|
part of the implementation of the compression library and is
|
||||||
|
subject to change. Applications should only use zlib.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef ZUTIL_H
|
||||||
|
#define ZUTIL_H
|
||||||
|
|
||||||
|
#ifdef HAVE_HIDDEN
|
||||||
|
# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
|
||||||
|
#else
|
||||||
|
# define ZLIB_INTERNAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "zlib.h"
|
||||||
|
|
||||||
|
#if defined(STDC) && !defined(Z_SOLO)
|
||||||
|
# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
|
||||||
|
# include <stddef.h>
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef local
|
||||||
|
# define local static
|
||||||
|
#endif
|
||||||
|
/* since "static" is used to mean two completely different things in C, we
|
||||||
|
define "local" for the non-static meaning of "static", for readability
|
||||||
|
(compile with -Dlocal if your debugger can't find static symbols) */
|
||||||
|
|
||||||
|
typedef unsigned char uch;
|
||||||
|
typedef uch FAR uchf;
|
||||||
|
typedef unsigned short ush;
|
||||||
|
typedef ush FAR ushf;
|
||||||
|
typedef unsigned long ulg;
|
||||||
|
|
||||||
|
extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||||
|
/* (size given to avoid silly warnings with Visual C++) */
|
||||||
|
|
||||||
|
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
||||||
|
|
||||||
|
#define ERR_RETURN(strm,err) \
|
||||||
|
return (strm->msg = ERR_MSG(err), (err))
|
||||||
|
/* To be used only when the state is known to be valid */
|
||||||
|
|
||||||
|
/* common constants */
|
||||||
|
|
||||||
|
#ifndef DEF_WBITS
|
||||||
|
# define DEF_WBITS MAX_WBITS
|
||||||
|
#endif
|
||||||
|
/* default windowBits for decompression. MAX_WBITS is for compression only */
|
||||||
|
|
||||||
|
#if MAX_MEM_LEVEL >= 8
|
||||||
|
# define DEF_MEM_LEVEL 8
|
||||||
|
#else
|
||||||
|
# define DEF_MEM_LEVEL MAX_MEM_LEVEL
|
||||||
|
#endif
|
||||||
|
/* default memLevel */
|
||||||
|
|
||||||
|
#define STORED_BLOCK 0
|
||||||
|
#define STATIC_TREES 1
|
||||||
|
#define DYN_TREES 2
|
||||||
|
/* The three kinds of block type */
|
||||||
|
|
||||||
|
#define MIN_MATCH 3
|
||||||
|
#define MAX_MATCH 258
|
||||||
|
/* The minimum and maximum match lengths */
|
||||||
|
|
||||||
|
#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
|
||||||
|
|
||||||
|
/* target dependencies */
|
||||||
|
|
||||||
|
#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
|
||||||
|
# define OS_CODE 0x00
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# if defined(__TURBOC__) || defined(__BORLANDC__)
|
||||||
|
# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
|
||||||
|
/* Allow compilation with ANSI keywords only enabled */
|
||||||
|
void _Cdecl farfree( void *block );
|
||||||
|
void *_Cdecl farmalloc( unsigned long nbytes );
|
||||||
|
# else
|
||||||
|
# include <alloc.h>
|
||||||
|
# endif
|
||||||
|
# else /* MSC or DJGPP */
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AMIGA
|
||||||
|
# define OS_CODE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(VAXC) || defined(VMS)
|
||||||
|
# define OS_CODE 2
|
||||||
|
# define F_OPEN(name, mode) \
|
||||||
|
fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __370__
|
||||||
|
# if __TARGET_LIB__ < 0x20000000
|
||||||
|
# define OS_CODE 4
|
||||||
|
# elif __TARGET_LIB__ < 0x40000000
|
||||||
|
# define OS_CODE 11
|
||||||
|
# else
|
||||||
|
# define OS_CODE 8
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ATARI) || defined(atarist)
|
||||||
|
# define OS_CODE 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef OS2
|
||||||
|
# define OS_CODE 6
|
||||||
|
# if defined(M_I86) && !defined(Z_SOLO)
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
||||||
|
# define OS_CODE 7
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
||||||
|
# include <unix.h> /* for fdopen */
|
||||||
|
# else
|
||||||
|
# ifndef fdopen
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __acorn
|
||||||
|
# define OS_CODE 13
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(__CYGWIN__)
|
||||||
|
# define OS_CODE 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _BEOS_
|
||||||
|
# define OS_CODE 16
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __TOS_OS400__
|
||||||
|
# define OS_CODE 18
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# define OS_CODE 19
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_BEOS_) || defined(RISCOS)
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
|
||||||
|
# if defined(_WIN32_WCE)
|
||||||
|
# define fdopen(fd,mode) NULL /* No fdopen() */
|
||||||
|
# ifndef _PTRDIFF_T_DEFINED
|
||||||
|
typedef int ptrdiff_t;
|
||||||
|
# define _PTRDIFF_T_DEFINED
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define fdopen(fd,type) _fdopen(fd,type)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__BORLANDC__) && !defined(MSDOS)
|
||||||
|
#pragma warn -8004
|
||||||
|
#pragma warn -8008
|
||||||
|
#pragma warn -8066
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* provide prototypes for these when building zlib without LFS */
|
||||||
|
#if !defined(_WIN32) && \
|
||||||
|
(!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
|
||||||
|
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
|
||||||
|
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* common defaults */
|
||||||
|
|
||||||
|
#ifndef OS_CODE
|
||||||
|
# define OS_CODE 3 /* assume Unix */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef F_OPEN
|
||||||
|
# define F_OPEN(name, mode) fopen((name), (mode))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* functions */
|
||||||
|
|
||||||
|
#if defined(pyr) || defined(Z_SOLO)
|
||||||
|
# define NO_MEMCPY
|
||||||
|
#endif
|
||||||
|
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
|
||||||
|
/* Use our own functions for small and medium model with MSC <= 5.0.
|
||||||
|
* You may have to use the same strategy for Borland C (untested).
|
||||||
|
* The __SC__ check is for Symantec.
|
||||||
|
*/
|
||||||
|
# define NO_MEMCPY
|
||||||
|
#endif
|
||||||
|
#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
|
||||||
|
# define HAVE_MEMCPY
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_MEMCPY
|
||||||
|
# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
|
||||||
|
# define zmemcpy _fmemcpy
|
||||||
|
# define zmemcmp _fmemcmp
|
||||||
|
# define zmemzero(dest, len) _fmemset(dest, 0, len)
|
||||||
|
# else
|
||||||
|
# define zmemcpy memcpy
|
||||||
|
# define zmemcmp memcmp
|
||||||
|
# define zmemzero(dest, len) memset(dest, 0, len)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
|
||||||
|
int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
|
||||||
|
void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Diagnostic functions */
|
||||||
|
#ifdef ZLIB_DEBUG
|
||||||
|
# include <stdio.h>
|
||||||
|
extern int ZLIB_INTERNAL z_verbose;
|
||||||
|
extern void ZLIB_INTERNAL z_error OF((char *m));
|
||||||
|
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
|
||||||
|
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
|
||||||
|
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
|
||||||
|
# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
|
||||||
|
# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
|
||||||
|
# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
|
||||||
|
#else
|
||||||
|
# define Assert(cond,msg)
|
||||||
|
# define Trace(x)
|
||||||
|
# define Tracev(x)
|
||||||
|
# define Tracevv(x)
|
||||||
|
# define Tracec(c,x)
|
||||||
|
# define Tracecv(c,x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
|
||||||
|
unsigned size));
|
||||||
|
void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ZALLOC(strm, items, size) \
|
||||||
|
(*((strm)->zalloc))((strm)->opaque, (items), (size))
|
||||||
|
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
|
||||||
|
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
|
||||||
|
|
||||||
|
/* Reverse the bytes in a 32-bit value */
|
||||||
|
#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
|
||||||
|
(((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
|
||||||
|
|
||||||
|
#endif /* ZUTIL_H */
|
12
PdbServer/.config/dotnet-tools.json
Normal file
12
PdbServer/.config/dotnet-tools.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"isRoot": true,
|
||||||
|
"tools": {
|
||||||
|
"dotnet-ef": {
|
||||||
|
"version": "6.0.2",
|
||||||
|
"commands": [
|
||||||
|
"dotnet-ef"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
62
PdbServer/Controllers/Helpers.cs
Normal file
62
PdbServer/Controllers/Helpers.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace PdbServer.Controllers
|
||||||
|
{
|
||||||
|
public class Helpers
|
||||||
|
{
|
||||||
|
public static bool DownloadFile(string URL, string filename)
|
||||||
|
{
|
||||||
|
if(File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.Delete(filename);
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
|
||||||
|
HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
|
||||||
|
Stream st = myrp.GetResponseStream();
|
||||||
|
Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
|
||||||
|
byte[] by = new byte[1024];
|
||||||
|
int osize = st.Read(by, 0, (int)by.Length);
|
||||||
|
while (osize > 0)
|
||||||
|
{
|
||||||
|
so.Write(by, 0, osize);
|
||||||
|
osize = st.Read(by, 0, (int)by.Length);
|
||||||
|
}
|
||||||
|
so.Close();
|
||||||
|
st.Close();
|
||||||
|
myrp.Close();
|
||||||
|
Myrq.Abort();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (System.Exception e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static byte[] HttpDownload(string url)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
MemoryStream ms = new MemoryStream();
|
||||||
|
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
|
||||||
|
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
|
||||||
|
Stream responseStream = response.GetResponseStream();
|
||||||
|
byte[] bArr = new byte[1024];
|
||||||
|
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
|
||||||
|
while (size > 0)
|
||||||
|
{
|
||||||
|
ms.Write(bArr, 0, size);
|
||||||
|
size = responseStream.Read(bArr, 0, (int)bArr.Length);
|
||||||
|
}
|
||||||
|
ms.Close();
|
||||||
|
responseStream.Close();
|
||||||
|
return ms.GetBuffer();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
382
PdbServer/Controllers/Symbols.cs
Normal file
382
PdbServer/Controllers/Symbols.cs
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using SharpPdb.Native;
|
||||||
|
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
using Microsoft.AspNetCore.StaticFiles;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
using Zodiacon.DebugHelp;
|
||||||
|
|
||||||
|
using Microsoft.PdbDownloader.Logic.Pdb;
|
||||||
|
using Microsoft.PdbDownloader.Logic.Pe;
|
||||||
|
|
||||||
|
namespace PdbServer.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class Symbols : ControllerBase
|
||||||
|
{
|
||||||
|
[DllImport("Symbol Parser.dll",CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
public static extern int EnumFunction(IntPtr pdbpath,IntPtr fname);
|
||||||
|
|
||||||
|
//const string pdburl = "http://msdl.microsoft.com/download/";
|
||||||
|
const string pdburl = "http://msdl.blackint3.com:88/download/";
|
||||||
|
const string selfdocpath = "D:\\Web\\Symbols";
|
||||||
|
private readonly ILogger<Symbols> _logger;
|
||||||
|
public Symbols(ILogger<Symbols> logger)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryAllModuleSymbol")]
|
||||||
|
public string QueryAllModuleSymbol(string ModuleName, string Guid, string Agent)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
using var reader = new PdbFileReader(filename);
|
||||||
|
|
||||||
|
foreach (var v in reader.Functions)
|
||||||
|
{
|
||||||
|
sb.Append(v.Offset);
|
||||||
|
sb.Append('#');
|
||||||
|
sb.Append(v.Name);
|
||||||
|
sb.Append('|');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sb.Length > 0) sb.Length -= 1;
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("SymbolCheck")]
|
||||||
|
public int SymbolCheck(string ModuleName, string Guid, string Agent)
|
||||||
|
{
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if(System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes($"{selfdocpath}\\{Guid}_{Agent}.no", new byte[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
public static byte[] Compress(byte[] rawData)
|
||||||
|
{
|
||||||
|
System.IO.MemoryStream ms = new System.IO.MemoryStream();
|
||||||
|
System.IO.Compression.GZipStream compressedzipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true);
|
||||||
|
compressedzipStream.Write(rawData, 0, rawData.Length);
|
||||||
|
compressedzipStream.Close();
|
||||||
|
return ms.ToArray();
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("SymbolDownLoad")]
|
||||||
|
public string SymbolDownLoad(string ModuleName, string Guid, string Agent)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
byte[] filebuffer = System.IO.File.ReadAllBytes(filename);
|
||||||
|
var bytes= Compress(filebuffer);
|
||||||
|
for(int i=0;i<bytes.Length; i++)
|
||||||
|
{
|
||||||
|
sb.Append(bytes[i].ToString("X2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryModuleSymbol")]//https://localhost:7001/Symbols/QueryModuleSymbol?ModuleName=dwmcore.pdb&Guid=47E4AD6A46A936FC873379E0D86E94FC&Agent=1&QueryName=CLegacySwapChain::Present
|
||||||
|
public Int64 QueryModuleSymbol(string ModuleName, string Guid, string Agent, string QueryName)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
var offst = EnumFunction(Marshal.StringToHGlobalAnsi(filename), Marshal.StringToHGlobalAnsi(QueryName));
|
||||||
|
return offst;
|
||||||
|
//SymbolHandler handler = SymbolHandler.Create();
|
||||||
|
//ulong ptr = 0;
|
||||||
|
//ptr = handler.TryLoadSymbolsForModuleAsync(filename, 0x1000000UL).Result;
|
||||||
|
//foreach (var v in handler.EnumSymbols(ptr))
|
||||||
|
//{
|
||||||
|
// if (v.Name.Trim().ToLower() == QueryName.ToLower())
|
||||||
|
// {
|
||||||
|
// handler.Dispose();
|
||||||
|
// return (Int64)(v.Address - 0x1000000UL);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//handler.Dispose();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryModuleSymbolEX00A")]//https://localhost:7001/Symbols/QueryModuleSymbol?ModuleName=dwmcore.pdb&Guid=47E4AD6A46A936FC873379E0D86E94FC&Agent=1&QueryName=CLegacySwapChain::Present
|
||||||
|
public Int64 QueryModuleSymbolEX00A(string ModuleName, string Guid, string Agent, string QueryName)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}Marshal.StringToHGlobalAnsi(filename);
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
var offst = EnumFunction(Marshal.StringToHGlobalAnsi(filename), Marshal.StringToHGlobalAnsi(QueryName));
|
||||||
|
return offst;
|
||||||
|
//SymbolHandler handler = SymbolHandler.Create();
|
||||||
|
//ulong ptr = 0;
|
||||||
|
//ptr = handler.TryLoadSymbolsForModuleAsync(filename, 0x1000000UL).Result;
|
||||||
|
//foreach (var v in handler.EnumSymbols(ptr))
|
||||||
|
//{
|
||||||
|
// if (v.Name.Trim().ToLower() == QueryName.ToLower())
|
||||||
|
// {
|
||||||
|
// handler.Dispose();
|
||||||
|
// return (Int64)(v.Address - 0x1000000UL);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//handler.Dispose();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//https://localhost:7001/Symbols/QueryModuleStruct?ModuleName=ntkrnlmp.pdb&Guid=F55005B80C686C739E763E6CF2559D9F&Agent=1&StructName=_EPROCESS&FildName=ActiveProcessLinks
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryModuleStructFildOffset")]
|
||||||
|
public Int64 QueryModuleStructFildOffset(string ModuleName, string Guid, string Agent, string StructName, string FildName)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
using var reader = new PdbFileReader(filename);
|
||||||
|
foreach (var v in reader.UserDefinedTypes)
|
||||||
|
{
|
||||||
|
if (v is SharpPdb.Native.Types.PdbClassType _struct)
|
||||||
|
{
|
||||||
|
if (_struct.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var fild in _struct.Fields)
|
||||||
|
{
|
||||||
|
if (fild.Name == FildName)
|
||||||
|
{
|
||||||
|
return (Int64)fild.Offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbUnionType _struct1)
|
||||||
|
{
|
||||||
|
if (_struct1.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var fild in _struct1.Fields)
|
||||||
|
{
|
||||||
|
if (fild.Name == FildName)
|
||||||
|
{
|
||||||
|
return (Int64)fild.Offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbEnumType _enum)
|
||||||
|
{
|
||||||
|
if (_enum.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var val in _enum.Values)
|
||||||
|
{
|
||||||
|
if (val.Name == FildName)
|
||||||
|
{
|
||||||
|
return (Int64)val.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryModuleStructFilds")]
|
||||||
|
public string QueryModuleStructFilds(string ModuleName, string Guid, string Agent, string StructName)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
using var reader = new PdbFileReader(filename);
|
||||||
|
foreach (var v in reader.UserDefinedTypes)
|
||||||
|
{
|
||||||
|
if (v is SharpPdb.Native.Types.PdbClassType _struct)
|
||||||
|
{
|
||||||
|
if (_struct.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var fild in _struct.Fields)
|
||||||
|
{
|
||||||
|
sb.Append($"{fild.Name},{(Int64)fild.Offset};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbUnionType _struct1)
|
||||||
|
{
|
||||||
|
if (_struct1.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var fild in _struct1.Fields)
|
||||||
|
{
|
||||||
|
sb.Append($"{fild.Name},{(Int64)fild.Offset};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbEnumType _enum)
|
||||||
|
{
|
||||||
|
if (_enum.Name == StructName)
|
||||||
|
{
|
||||||
|
foreach (var val in _enum.Values)
|
||||||
|
{
|
||||||
|
sb.Append($"{val.Name},{val.Value};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
//http://www.sym101.com/Symbols/QueryModuleStruct?ModuleName=ntkrnlmp.pdb&Guid=F55005B80C686C739E763E6CF2559D9F&Agent=1
|
||||||
|
[HttpGet]
|
||||||
|
[Route("QueryModuleStruct")]
|
||||||
|
public string QueryModuleStruct(string ModuleName, string Guid, string Agent)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
using var reader = new PdbFileReader(filename);
|
||||||
|
foreach (var v in reader.UserDefinedTypes)
|
||||||
|
{
|
||||||
|
if (v is SharpPdb.Native.Types.PdbClassType _struct)
|
||||||
|
{
|
||||||
|
sb.Append($"{v.Name}@");
|
||||||
|
foreach (var fild in _struct.Fields)
|
||||||
|
{
|
||||||
|
sb.Append($"{fild.Name},{(Int64)fild.Offset};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbUnionType _struct1)
|
||||||
|
{
|
||||||
|
sb.Append($"{v.Name}@");
|
||||||
|
foreach (var fild in _struct1.Fields)
|
||||||
|
{
|
||||||
|
sb.Append($"{fild.Name},{(Int64)fild.Offset};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (v is SharpPdb.Native.Types.PdbEnumType _enum)
|
||||||
|
{
|
||||||
|
sb.Append($"{v.Name}@");
|
||||||
|
foreach (var val in _enum.Values)
|
||||||
|
{
|
||||||
|
sb.Append($"{val.Name},{val.Value};");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
166
PdbServer/Controllers/Users.cs
Normal file
166
PdbServer/Controllers/Users.cs
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.PdbDownloader.Logic.Pe;
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace PdbServer.Controllers
|
||||||
|
{
|
||||||
|
[Route("[controller]")]
|
||||||
|
[ApiController]
|
||||||
|
public class Users : ControllerBase
|
||||||
|
{
|
||||||
|
const string selfdocpath = "D:\\Web\\UserData";
|
||||||
|
private readonly ILogger<Users> _logger;
|
||||||
|
public Users(ILogger<Users> logger)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("FileDownLoadGZ")]
|
||||||
|
public string FileDownLoadGZ(string Filename)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{Filename}";
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
byte[] bytes = Symbols.Compress(System.IO.File.ReadAllBytes(filename));
|
||||||
|
for (int i = 0; i < bytes.Length; i++)
|
||||||
|
{
|
||||||
|
sb.Append(bytes[i].ToString("X2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
static List<string> Ips = new List<string>();
|
||||||
|
[HttpGet]
|
||||||
|
[Route("FileDownLoadGZLog")]
|
||||||
|
public string FileDownLoadGZLog(string Filename)
|
||||||
|
{
|
||||||
|
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress.ToString();
|
||||||
|
if (!Ips.Contains(remoteIpAddress))
|
||||||
|
{
|
||||||
|
Ips.Add(remoteIpAddress);
|
||||||
|
System.IO.File.WriteAllLines($"{selfdocpath}\\Log.txt", Ips);
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{Filename}";
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
byte[] bytes = Symbols.Compress(System.IO.File.ReadAllBytes(filename));
|
||||||
|
for (int i = 0; i < bytes.Length; i++)
|
||||||
|
{
|
||||||
|
sb.Append(bytes[i].ToString("X2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
public IActionResult CustomFileDownload(string filename)
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"C:\\Web\\Sym\\UpdateFiles\\{filename}"))
|
||||||
|
{
|
||||||
|
return File(new System.IO.FileStream($"C:\\Web\\Sym\\UpdateFiles\\{filename}", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite), "application/x-zip-compressed", filename);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("FileDownLoadNormal")]
|
||||||
|
public IActionResult FileDownLoadNormal(string Filename)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
string filename = $"{selfdocpath}\\{Filename}";
|
||||||
|
FileInfo fileInfo = new FileInfo(filename);
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
return File(new System.IO.FileStream(
|
||||||
|
filename,
|
||||||
|
System.IO.FileMode.Open,
|
||||||
|
System.IO.FileAccess.Read,
|
||||||
|
System.IO.FileShare.ReadWrite),
|
||||||
|
"application/x-zip-compressed",
|
||||||
|
fileInfo.Name);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
List<byte> ParseHex(string hex)
|
||||||
|
{
|
||||||
|
List<byte> result = new List<byte>();
|
||||||
|
int len = hex.Length;
|
||||||
|
bool ish = true;
|
||||||
|
byte val = 0;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
bool isval = false;
|
||||||
|
byte v = 0;
|
||||||
|
if (hex[i] >= '0' && hex[i] <= '9')
|
||||||
|
{
|
||||||
|
v = (byte)(hex[i] - '0');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
else if (hex[i] >= 'A' && hex[i] <= 'F')
|
||||||
|
{
|
||||||
|
v = (byte)(10 + (hex[i] - 'A'));
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (hex[i] >= 'a' && hex[i] <= 'f')
|
||||||
|
{
|
||||||
|
v = (byte)(10 + (hex[i] - 'a'));
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
if (isval)
|
||||||
|
{
|
||||||
|
if (ish)
|
||||||
|
{
|
||||||
|
val = (byte)((v << 4) | val);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val = (byte)(v | val);
|
||||||
|
result.Add(val);
|
||||||
|
val = 0;
|
||||||
|
}
|
||||||
|
ish = !ish;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
[HttpPost]
|
||||||
|
[Route("FileUpLoad/{Filename}")]
|
||||||
|
public int FileUpLoad(string Filename, [FromBody] string buffer)
|
||||||
|
{
|
||||||
|
var bytes = ParseHex(buffer);
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Filename}"))
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes($"{selfdocpath}\\{Filename}", bytes.ToArray());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes($"{selfdocpath}\\{Filename}", bytes.ToArray());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[HttpPost]
|
||||||
|
[Route("FileUpLoadBytes/{Filename}")]
|
||||||
|
public int FileUpLoadBytes(string Filename, [FromBody] HttpRequestMessage req)
|
||||||
|
{
|
||||||
|
var content = req.Content.ReadAsStream();
|
||||||
|
byte[] bytes = new byte[content.Length];
|
||||||
|
int len = content.Read(bytes, 0, bytes.Length);
|
||||||
|
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Filename}"))
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes($"{selfdocpath}\\{Filename}", bytes.ToArray());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes($"{selfdocpath}\\{Filename}", bytes.ToArray());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
84
PdbServer/Controllers/download.cs
Normal file
84
PdbServer/Controllers/download.cs
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace PdbServer.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("[controller]")]
|
||||||
|
public class download : Controller
|
||||||
|
{
|
||||||
|
const string selfdocpath = "D:\\Web\\Symbols";
|
||||||
|
//const string pdburl = "http://msdl.microsoft.com/download/";
|
||||||
|
const string pdburl = "http://msdl.blackint3.com:88/download/";
|
||||||
|
private readonly ILogger<download> _logger;
|
||||||
|
public download(ILogger<download> logger)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
static Random rnd = new Random();
|
||||||
|
string randomstr()
|
||||||
|
{
|
||||||
|
string result = "";
|
||||||
|
for(int i=0;i<64;i++)
|
||||||
|
{
|
||||||
|
result += rnd.Next(0,9).ToString();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
[Route("hdgfuiaksjdhuigdfasrjhtfl")]//http://43.154.135.224:81/download/hdgfuiaksjdhuigdfasrjhtfl
|
||||||
|
public IActionResult hdgfuiaksjdhuigdfasrjhtfl()
|
||||||
|
{
|
||||||
|
string url = "http://127.0.0.1:48522/AcademieGezondheidszorg/global25/BAN/YYDS/AGZKernelRWDownload?key=";
|
||||||
|
url += randomstr();
|
||||||
|
bool state = Helpers.DownloadFile(url, "C:\\Web\\Sym\\TMP\\hdgfuiaksjdhuigdfasrjhtfl.sys");
|
||||||
|
return File(new System.IO.FileStream("C:\\Web\\Sym\\TMP\\hdgfuiaksjdhuigdfasrjhtfl.sys", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite), "application/x-zip-compressed", "xxx.sys");
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[Route("{filename}")]//http://43.154.135.224:81/download/INJ.sys
|
||||||
|
public IActionResult CustomFileDownload(string filename)
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"C:\\Web\\Sym\\UpdateFiles\\{filename}"))
|
||||||
|
{
|
||||||
|
return File(new System.IO.FileStream($"C:\\Web\\Sym\\UpdateFiles\\{filename}", System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite), "application/x-zip-compressed", filename);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
[Route("symbols/{ModuleName}/{_Guid_AGE}/{_ModuleName}")]
|
||||||
|
public IActionResult symbols(string ModuleName, string _Guid_AGE, string _ModuleName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string Guid = _Guid_AGE.Substring(0, _Guid_AGE.Length - 1);
|
||||||
|
string Agent = _Guid_AGE.Substring(_Guid_AGE.Length - 1, 1);
|
||||||
|
string filename = $"{selfdocpath}\\{ModuleName}_{Guid}_{Agent}.pdb";
|
||||||
|
if (!System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
if (System.IO.File.Exists($"{selfdocpath}\\{Guid}_{Agent}.no"))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
byte[] data = Helpers.HttpDownload($"{pdburl}symbols/{ModuleName}/{Guid}{Agent}/{ModuleName}");
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllBytes(filename, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (System.IO.File.Exists(filename))
|
||||||
|
{
|
||||||
|
return File(new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite), "application/x-zip-compressed", ModuleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
PdbServer/Logic/Pdb/PdbDownloadResult.cs
Normal file
25
PdbServer/Logic/Pdb/PdbDownloadResult.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pdb
|
||||||
|
{
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
internal class PdbDownloadResult
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the response status.
|
||||||
|
/// </summary>
|
||||||
|
internal HttpStatusCode ResponseStatus
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the response buffer.
|
||||||
|
/// </summary>
|
||||||
|
internal byte[] ResponseBuffer
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
85
PdbServer/Logic/Pdb/PdbDownloader.cs
Normal file
85
PdbServer/Logic/Pdb/PdbDownloader.cs
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pdb
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
internal static class PdbDownloader
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The URL to the Microsoft Symbols Server, where the PDB files are hosted.
|
||||||
|
/// </summary>
|
||||||
|
internal const string MicrosoftSymbolsUrl = "https://msdl.microsoft.com/download/symbols";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tries to retrieve and download the PDB file for the given module.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="FileName">The name of the file.</param>
|
||||||
|
/// <param name="Hash">The debug hash of the file.</param>
|
||||||
|
internal static async Task<PdbDownloadResult> TryDownloadPdbFile(string FileName, string Hash)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Verify the passed parameters.
|
||||||
|
//
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(FileName))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(FileName), "The filename is null or empty.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(Hash))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(Hash), "The hash is null or empty.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Format the parameters correctly.
|
||||||
|
//
|
||||||
|
|
||||||
|
if (FileName.Contains("."))
|
||||||
|
{
|
||||||
|
FileName = FileName.Split('.')[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Hash.Length == 32)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// The hash must contain the "age" of the file at the end.
|
||||||
|
//
|
||||||
|
|
||||||
|
Hash += "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initialize the returned structure.
|
||||||
|
//
|
||||||
|
|
||||||
|
var ReturnedResult = new PdbDownloadResult();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to download the PDB file from the Microsoft Symbols Server.
|
||||||
|
//
|
||||||
|
|
||||||
|
using (var HttpClient = new HttpClient())
|
||||||
|
{
|
||||||
|
var HttpResponse = await HttpClient.GetAsync($"{MicrosoftSymbolsUrl}/{FileName}.pdb/{Hash}/{FileName}.pdb");
|
||||||
|
|
||||||
|
using (HttpResponse)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Set the result to the returned structure.
|
||||||
|
//
|
||||||
|
|
||||||
|
ReturnedResult.ResponseStatus = HttpResponse.StatusCode;
|
||||||
|
|
||||||
|
if (HttpResponse.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
ReturnedResult.ResponseBuffer = await HttpResponse.Content.ReadAsByteArrayAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ReturnedResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
PdbServer/Logic/Pe/PeFile.cs
Normal file
7
PdbServer/Logic/Pe/PeFile.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pe
|
||||||
|
{
|
||||||
|
internal class PeFile
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
99
PdbServer/Logic/Pe/PeUtils.cs
Normal file
99
PdbServer/Logic/Pe/PeUtils.cs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pe
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
using Microsoft.PdbDownloader.Logic.Pe.Structures;
|
||||||
|
|
||||||
|
internal static class PeUtils
|
||||||
|
{
|
||||||
|
internal static unsafe bool TryGetPdbMetadata(byte[] Buffer, out string PdbName, out string PdbHash)
|
||||||
|
{
|
||||||
|
PdbName = null;
|
||||||
|
PdbHash = null;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Build a pointer to the managed buffer.
|
||||||
|
//
|
||||||
|
|
||||||
|
fixed (byte* FixedBuffer = Buffer)
|
||||||
|
{
|
||||||
|
var DosHeader = (IMAGE_DOS_HEADER*) FixedBuffer;
|
||||||
|
var NtHeaders = (IMAGE_NT_HEADERS64*) IntPtr.Add(new IntPtr(FixedBuffer), DosHeader->e_lfanew).ToPointer();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse the debug directory.
|
||||||
|
//
|
||||||
|
|
||||||
|
var DebugDirectory = &NtHeaders->OptionalHeader.Debug;
|
||||||
|
|
||||||
|
Debug.WriteLine("[*] DebugDirectory.VirtualAddress: 0x" + DebugDirectory->VirtualAddress.ToString("X8"));
|
||||||
|
Debug.WriteLine("[*] DebugDirectory.Size: " + DebugDirectory->Size);
|
||||||
|
|
||||||
|
if (DebugDirectory->VirtualAddress != 0)
|
||||||
|
{
|
||||||
|
var DebugEntries = (IMAGE_DEBUG_DIRECTORY*) VaToRva(Buffer, IntPtr.Add(new IntPtr(FixedBuffer), (int)DebugDirectory->VirtualAddress).ToPointer());
|
||||||
|
var DebugEntriesSizeRead = 0;
|
||||||
|
var DebugEntriesIndex = 0;
|
||||||
|
|
||||||
|
for (var DebugEntry = DebugEntries;
|
||||||
|
DebugEntriesSizeRead < DebugDirectory->Size;
|
||||||
|
DebugEntriesSizeRead += sizeof(IMAGE_DEBUG_DIRECTORY), DebugEntry++)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check if this is a CodeView debug entry.
|
||||||
|
//
|
||||||
|
|
||||||
|
if (DebugEntry->Type == 2)
|
||||||
|
{
|
||||||
|
var DebugData = (IMAGE_DEBUG_DATA*) IntPtr.Add(new IntPtr(FixedBuffer), (int) DebugEntry->PointerToRawData);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set the returned values.
|
||||||
|
//
|
||||||
|
|
||||||
|
PdbName = Marshal.PtrToStringAnsi(new IntPtr(&DebugData->PdbFileName));
|
||||||
|
PdbHash = $"{DebugData->Guid:N}{DebugData->Age}".ToUpper();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !string.IsNullOrEmpty(PdbName) && !string.IsNullOrEmpty(PdbHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static unsafe void* VaToRva(byte[] Buffer, void* VirtualAddress)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Build a pointer to the managed buffer.
|
||||||
|
//
|
||||||
|
|
||||||
|
fixed (byte* FixedBuffer = Buffer)
|
||||||
|
{
|
||||||
|
var DosHeader = (IMAGE_DOS_HEADER*) FixedBuffer;
|
||||||
|
var NtHeaders = (IMAGE_NT_HEADERS64*) IntPtr.Add(new IntPtr(FixedBuffer), DosHeader->e_lfanew).ToPointer();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse the sections.
|
||||||
|
//
|
||||||
|
|
||||||
|
var CurrentSection = (IMAGE_SECTION_HEADER*) IntPtr.Add(new IntPtr(NtHeaders), sizeof(IMAGE_NT_HEADERS64)).ToPointer();
|
||||||
|
|
||||||
|
for (var I = 0; I < NtHeaders->FileHeader.NumberOfSections; I++, CurrentSection++)
|
||||||
|
{
|
||||||
|
var BeginSection = IntPtr.Add(new IntPtr(FixedBuffer), (int) CurrentSection->VirtualAddress).ToPointer();
|
||||||
|
var EndSection = IntPtr.Add(new IntPtr(BeginSection), (int) CurrentSection->VirtualSize).ToPointer();
|
||||||
|
|
||||||
|
if (VirtualAddress >= BeginSection && VirtualAddress < EndSection)
|
||||||
|
{
|
||||||
|
return IntPtr.Add(IntPtr.Subtract(new IntPtr(VirtualAddress), (int) CurrentSection->VirtualAddress), (int) CurrentSection->PointerToRawData).ToPointer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
561
PdbServer/Logic/Pe/Structures/PE.cs
Normal file
561
PdbServer/Logic/Pe/Structures/PE.cs
Normal file
@ -0,0 +1,561 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pe.Structures
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 0x40)]
|
||||||
|
public struct IMAGE_DOS_HEADER
|
||||||
|
{
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public UInt16 e_magic; // Magic number
|
||||||
|
|
||||||
|
[FieldOffset(0x3C)]
|
||||||
|
public Int32 e_lfanew; // File address of new exe header
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_NT_HEADERS64
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public int Signature;
|
||||||
|
|
||||||
|
[FieldOffset(4)]
|
||||||
|
public IMAGE_FILE_HEADER FileHeader;
|
||||||
|
|
||||||
|
[FieldOffset(24)]
|
||||||
|
public IMAGE_OPTIONAL_HEADER64 OptionalHeader;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct IMAGE_FILE_HEADER
|
||||||
|
{
|
||||||
|
public UInt16 Machine;
|
||||||
|
public UInt16 NumberOfSections;
|
||||||
|
public UInt32 TimeDateStamp;
|
||||||
|
public UInt32 PointerToSymbolTable;
|
||||||
|
public UInt32 NumberOfSymbols;
|
||||||
|
public UInt16 SizeOfOptionalHeader;
|
||||||
|
public UInt16 Characteristics;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_OPTIONAL_HEADER64
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public MagicType Magic;
|
||||||
|
|
||||||
|
[FieldOffset(2)]
|
||||||
|
public byte MajorLinkerVersion;
|
||||||
|
|
||||||
|
[FieldOffset(3)]
|
||||||
|
public byte MinorLinkerVersion;
|
||||||
|
|
||||||
|
[FieldOffset(4)]
|
||||||
|
public uint SizeOfCode;
|
||||||
|
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public uint SizeOfInitializedData;
|
||||||
|
|
||||||
|
[FieldOffset(12)]
|
||||||
|
public uint SizeOfUninitializedData;
|
||||||
|
|
||||||
|
[FieldOffset(16)]
|
||||||
|
public uint AddressOfEntryPoint;
|
||||||
|
|
||||||
|
[FieldOffset(20)]
|
||||||
|
public uint BaseOfCode;
|
||||||
|
|
||||||
|
[FieldOffset(24)]
|
||||||
|
public ulong ImageBase;
|
||||||
|
|
||||||
|
[FieldOffset(32)]
|
||||||
|
public uint SectionAlignment;
|
||||||
|
|
||||||
|
[FieldOffset(36)]
|
||||||
|
public uint FileAlignment;
|
||||||
|
|
||||||
|
[FieldOffset(40)]
|
||||||
|
public ushort MajorOperatingSystemVersion;
|
||||||
|
|
||||||
|
[FieldOffset(42)]
|
||||||
|
public ushort MinorOperatingSystemVersion;
|
||||||
|
|
||||||
|
[FieldOffset(44)]
|
||||||
|
public ushort MajorImageVersion;
|
||||||
|
|
||||||
|
[FieldOffset(46)]
|
||||||
|
public ushort MinorImageVersion;
|
||||||
|
|
||||||
|
[FieldOffset(48)]
|
||||||
|
public ushort MajorSubsystemVersion;
|
||||||
|
|
||||||
|
[FieldOffset(50)]
|
||||||
|
public ushort MinorSubsystemVersion;
|
||||||
|
|
||||||
|
[FieldOffset(52)]
|
||||||
|
public uint Win32VersionValue;
|
||||||
|
|
||||||
|
[FieldOffset(56)]
|
||||||
|
public uint SizeOfImage;
|
||||||
|
|
||||||
|
[FieldOffset(60)]
|
||||||
|
public uint SizeOfHeaders;
|
||||||
|
|
||||||
|
[FieldOffset(64)]
|
||||||
|
public uint CheckSum;
|
||||||
|
|
||||||
|
[FieldOffset(68)]
|
||||||
|
public SubSystemType Subsystem;
|
||||||
|
|
||||||
|
[FieldOffset(70)]
|
||||||
|
public DllCharacteristicsType DllCharacteristics;
|
||||||
|
|
||||||
|
[FieldOffset(72)]
|
||||||
|
public ulong SizeOfStackReserve;
|
||||||
|
|
||||||
|
[FieldOffset(80)]
|
||||||
|
public ulong SizeOfStackCommit;
|
||||||
|
|
||||||
|
[FieldOffset(88)]
|
||||||
|
public ulong SizeOfHeapReserve;
|
||||||
|
|
||||||
|
[FieldOffset(96)]
|
||||||
|
public ulong SizeOfHeapCommit;
|
||||||
|
|
||||||
|
[FieldOffset(104)]
|
||||||
|
public uint LoaderFlags;
|
||||||
|
|
||||||
|
[FieldOffset(108)]
|
||||||
|
public uint NumberOfRvaAndSizes;
|
||||||
|
|
||||||
|
[FieldOffset(112)]
|
||||||
|
public IMAGE_DATA_DIRECTORY ExportTable;
|
||||||
|
|
||||||
|
[FieldOffset(120)]
|
||||||
|
public IMAGE_DATA_DIRECTORY ImportTable;
|
||||||
|
|
||||||
|
[FieldOffset(128)]
|
||||||
|
public IMAGE_DATA_DIRECTORY ResourceTable;
|
||||||
|
|
||||||
|
[FieldOffset(136)]
|
||||||
|
public IMAGE_DATA_DIRECTORY ExceptionTable;
|
||||||
|
|
||||||
|
[FieldOffset(144)]
|
||||||
|
public IMAGE_DATA_DIRECTORY CertificateTable;
|
||||||
|
|
||||||
|
[FieldOffset(152)]
|
||||||
|
public IMAGE_DATA_DIRECTORY BaseRelocationTable;
|
||||||
|
|
||||||
|
[FieldOffset(160)]
|
||||||
|
public IMAGE_DATA_DIRECTORY Debug;
|
||||||
|
|
||||||
|
[FieldOffset(168)]
|
||||||
|
public IMAGE_DATA_DIRECTORY Architecture;
|
||||||
|
|
||||||
|
[FieldOffset(176)]
|
||||||
|
public IMAGE_DATA_DIRECTORY GlobalPtr;
|
||||||
|
|
||||||
|
[FieldOffset(184)]
|
||||||
|
public IMAGE_DATA_DIRECTORY TLSTable;
|
||||||
|
|
||||||
|
[FieldOffset(192)]
|
||||||
|
public IMAGE_DATA_DIRECTORY LoadConfigTable;
|
||||||
|
|
||||||
|
[FieldOffset(200)]
|
||||||
|
public IMAGE_DATA_DIRECTORY BoundImport;
|
||||||
|
|
||||||
|
[FieldOffset(208)]
|
||||||
|
public IMAGE_DATA_DIRECTORY IAT;
|
||||||
|
|
||||||
|
[FieldOffset(216)]
|
||||||
|
public IMAGE_DATA_DIRECTORY DelayImportDescriptor;
|
||||||
|
|
||||||
|
[FieldOffset(224)]
|
||||||
|
public IMAGE_DATA_DIRECTORY CLRRuntimeHeader;
|
||||||
|
|
||||||
|
[FieldOffset(232)]
|
||||||
|
public IMAGE_DATA_DIRECTORY Reserved;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct IMAGE_DATA_DIRECTORY
|
||||||
|
{
|
||||||
|
public UInt32 VirtualAddress;
|
||||||
|
public UInt32 Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_SECTION_HEADER
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public ulong Name;
|
||||||
|
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public UInt32 VirtualSize;
|
||||||
|
|
||||||
|
[FieldOffset(12)]
|
||||||
|
public UInt32 VirtualAddress;
|
||||||
|
|
||||||
|
[FieldOffset(16)]
|
||||||
|
public UInt32 SizeOfRawData;
|
||||||
|
|
||||||
|
[FieldOffset(20)]
|
||||||
|
public UInt32 PointerToRawData;
|
||||||
|
|
||||||
|
[FieldOffset(24)]
|
||||||
|
public UInt32 PointerToRelocations;
|
||||||
|
|
||||||
|
[FieldOffset(28)]
|
||||||
|
public UInt32 PointerToLinenumbers;
|
||||||
|
|
||||||
|
[FieldOffset(32)]
|
||||||
|
public UInt16 NumberOfRelocations;
|
||||||
|
|
||||||
|
[FieldOffset(34)]
|
||||||
|
public UInt16 NumberOfLinenumbers;
|
||||||
|
|
||||||
|
[FieldOffset(36)]
|
||||||
|
public DataSectionFlags Characteristics;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_BASE_RELOCATION
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public uint VirtualAddress;
|
||||||
|
|
||||||
|
[FieldOffset(4)]
|
||||||
|
public uint SizeOfBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_DEBUG_DIRECTORY
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public uint Characteristics;
|
||||||
|
|
||||||
|
[FieldOffset(4)]
|
||||||
|
public uint TimeDateStamp;
|
||||||
|
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public ushort MajorVersion;
|
||||||
|
|
||||||
|
[FieldOffset(10)]
|
||||||
|
public ushort MinorVersion;
|
||||||
|
|
||||||
|
[FieldOffset(12)]
|
||||||
|
public uint Type;
|
||||||
|
|
||||||
|
[FieldOffset(16)]
|
||||||
|
public uint SizeOfData;
|
||||||
|
|
||||||
|
[FieldOffset(20)]
|
||||||
|
public uint AddressOfRawData;
|
||||||
|
|
||||||
|
[FieldOffset(24)]
|
||||||
|
public uint PointerToRawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public unsafe struct IMAGE_DEBUG_DATA
|
||||||
|
{
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public char Signature;
|
||||||
|
|
||||||
|
[FieldOffset(0x01)]
|
||||||
|
private char _Signature2;
|
||||||
|
[FieldOffset(0x02)]
|
||||||
|
private char _Signature3;
|
||||||
|
[FieldOffset(0x03)]
|
||||||
|
private char _Signature4;
|
||||||
|
|
||||||
|
[FieldOffset(0x04)]
|
||||||
|
public Guid Guid;
|
||||||
|
|
||||||
|
[FieldOffset(0x14)]
|
||||||
|
public int Age;
|
||||||
|
|
||||||
|
[FieldOffset(0x18)]
|
||||||
|
public char PdbFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum DataSectionFlags : uint
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeReg = 0x00000000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeDsect = 0x00000001,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeNoLoad = 0x00000002,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeGroup = 0x00000004,
|
||||||
|
/// <summary>
|
||||||
|
/// The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
TypeNoPadded = 0x00000008,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeCopy = 0x00000010,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains executable code.
|
||||||
|
/// </summary>
|
||||||
|
ContentCode = 0x00000020,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains initialized data.
|
||||||
|
/// </summary>
|
||||||
|
ContentInitializedData = 0x00000040,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains uninitialized data.
|
||||||
|
/// </summary>
|
||||||
|
ContentUninitializedData = 0x00000080,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
LinkOther = 0x00000100,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains comments or other information. The .drectve section has this type. This is valid for object files only.
|
||||||
|
/// </summary>
|
||||||
|
LinkInfo = 0x00000200,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
TypeOver = 0x00000400,
|
||||||
|
/// <summary>
|
||||||
|
/// The section will not become part of the image. This is valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
LinkRemove = 0x00000800,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains COMDAT data. For more information, see section 5.5.6, COMDAT Sections (Object Only). This is valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
LinkComDat = 0x00001000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reset speculative exceptions handling bits in the TLB entries for this section.
|
||||||
|
/// </summary>
|
||||||
|
NoDeferSpecExceptions = 0x00004000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains data referenced through the global pointer (GP).
|
||||||
|
/// </summary>
|
||||||
|
RelativeGP = 0x00008000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
MemPurgeable = 0x00020000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
Memory16Bit = 0x00020000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
MemoryLocked = 0x00040000,
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved for future use.
|
||||||
|
/// </summary>
|
||||||
|
MemoryPreload = 0x00080000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 1-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align1Bytes = 0x00100000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 2-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align2Bytes = 0x00200000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 4-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align4Bytes = 0x00300000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on an 8-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align8Bytes = 0x00400000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 16-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align16Bytes = 0x00500000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 32-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align32Bytes = 0x00600000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 64-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align64Bytes = 0x00700000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 128-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align128Bytes = 0x00800000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 256-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align256Bytes = 0x00900000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 512-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align512Bytes = 0x00A00000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 1024-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align1024Bytes = 0x00B00000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 2048-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align2048Bytes = 0x00C00000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on a 4096-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align4096Bytes = 0x00D00000,
|
||||||
|
/// <summary>
|
||||||
|
/// Align data on an 8192-byte boundary. Valid only for object files.
|
||||||
|
/// </summary>
|
||||||
|
Align8192Bytes = 0x00E00000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section contains extended relocations.
|
||||||
|
/// </summary>
|
||||||
|
LinkExtendedRelocationOverflow = 0x01000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section can be discarded as needed.
|
||||||
|
/// </summary>
|
||||||
|
MemoryDiscardable = 0x02000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section cannot be cached.
|
||||||
|
/// </summary>
|
||||||
|
MemoryNotCached = 0x04000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section is not pageable.
|
||||||
|
/// </summary>
|
||||||
|
MemoryNotPaged = 0x08000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section can be shared in memory.
|
||||||
|
/// </summary>
|
||||||
|
MemoryShared = 0x10000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section can be executed as code.
|
||||||
|
/// </summary>
|
||||||
|
MemoryExecute = 0x20000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section can be read.
|
||||||
|
/// </summary>
|
||||||
|
MemoryRead = 0x40000000,
|
||||||
|
/// <summary>
|
||||||
|
/// The section can be written to.
|
||||||
|
/// </summary>
|
||||||
|
MemoryWrite = 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MachineType : ushort
|
||||||
|
{
|
||||||
|
Native = 0,
|
||||||
|
I386 = 0x014c,
|
||||||
|
Itanium = 0x0200,
|
||||||
|
x64 = 0x8664
|
||||||
|
}
|
||||||
|
public enum MagicType : ushort
|
||||||
|
{
|
||||||
|
IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x10b,
|
||||||
|
IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x20b
|
||||||
|
}
|
||||||
|
public enum SubSystemType : ushort
|
||||||
|
{
|
||||||
|
IMAGE_SUBSYSTEM_UNKNOWN = 0,
|
||||||
|
IMAGE_SUBSYSTEM_NATIVE = 1,
|
||||||
|
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2,
|
||||||
|
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3,
|
||||||
|
IMAGE_SUBSYSTEM_POSIX_CUI = 7,
|
||||||
|
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9,
|
||||||
|
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10,
|
||||||
|
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11,
|
||||||
|
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12,
|
||||||
|
IMAGE_SUBSYSTEM_EFI_ROM = 13,
|
||||||
|
IMAGE_SUBSYSTEM_XBOX = 14
|
||||||
|
|
||||||
|
}
|
||||||
|
public enum DllCharacteristicsType : ushort
|
||||||
|
{
|
||||||
|
RES_0 = 0x0001,
|
||||||
|
RES_1 = 0x0002,
|
||||||
|
RES_2 = 0x0004,
|
||||||
|
RES_3 = 0x0008,
|
||||||
|
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040,
|
||||||
|
IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080,
|
||||||
|
IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100,
|
||||||
|
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x0200,
|
||||||
|
IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x0400,
|
||||||
|
IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x0800,
|
||||||
|
RES_4 = 0x1000,
|
||||||
|
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000,
|
||||||
|
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RelocationType
|
||||||
|
{
|
||||||
|
public const short IMAGE_REL_BASED_ABSOLUTE = 0;
|
||||||
|
public const short IMAGE_REL_BASED_HIGH = 1;
|
||||||
|
public const short IMAGE_REL_BASED_LOW = 2;
|
||||||
|
public const short IMAGE_REL_BASED_HIGHLOW = 3;
|
||||||
|
public const short IMAGE_REL_BASED_HIGHADJ = 4;
|
||||||
|
public const short IMAGE_REL_BASED_MACHINE_SPECIFIC_5 = 5;
|
||||||
|
public const short IMAGE_REL_BASED_RESERVED = 6;
|
||||||
|
public const short IMAGE_REL_BASED_MACHINE_SPECIFIC_7 = 7;
|
||||||
|
public const short IMAGE_REL_BASED_MACHINE_SPECIFIC_8 = 8;
|
||||||
|
public const short IMAGE_REL_BASED_MACHINE_SPECIFIC_9 = 9;
|
||||||
|
public const short IMAGE_REL_BASED_DIR64 = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_IMPORT_DESCRIPTOR
|
||||||
|
{
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public int Characteristics;
|
||||||
|
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public int OriginalFirstThunk;
|
||||||
|
|
||||||
|
[FieldOffset(0x04)]
|
||||||
|
public int TimeDateStamp;
|
||||||
|
|
||||||
|
[FieldOffset(0x08)]
|
||||||
|
public int ForwarderChain;
|
||||||
|
|
||||||
|
[FieldOffset(0x0C)]
|
||||||
|
public int Name;
|
||||||
|
|
||||||
|
[FieldOffset(0x10)]
|
||||||
|
public int FirstThunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_IMPORT_BY_NAME
|
||||||
|
{
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public short Hint;
|
||||||
|
|
||||||
|
[FieldOffset(0x02)]
|
||||||
|
public char Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
public struct IMAGE_THUNK_DATA64
|
||||||
|
{
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public ulong ForwarderString;
|
||||||
|
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public ulong Function;
|
||||||
|
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public ulong Ordinal;
|
||||||
|
|
||||||
|
[FieldOffset(0x00)]
|
||||||
|
public ulong AddressOfData;
|
||||||
|
}
|
||||||
|
}
|
20
PdbServer/Logic/Pe/Structures/SYSTEM_MODULE_ENTRY.cs
Normal file
20
PdbServer/Logic/Pe/Structures/SYSTEM_MODULE_ENTRY.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pe.Structures
|
||||||
|
{
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 296)]
|
||||||
|
public struct SYSTEM_MODULE_ENTRY
|
||||||
|
{
|
||||||
|
public UIntPtr Section;
|
||||||
|
public UIntPtr MappedBase;
|
||||||
|
public UIntPtr ImageBase;
|
||||||
|
public int ImageSize;
|
||||||
|
public uint Flags;
|
||||||
|
public ushort LoadOrderIndex;
|
||||||
|
public ushort InitOrderIndex;
|
||||||
|
public ushort LoadCount;
|
||||||
|
public ushort OffsetToFileName;
|
||||||
|
public char FullPathName;
|
||||||
|
}
|
||||||
|
}
|
10
PdbServer/Logic/Pe/Structures/SYSTEM_MODULE_INFORMATION.cs
Normal file
10
PdbServer/Logic/Pe/Structures/SYSTEM_MODULE_INFORMATION.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
namespace Microsoft.PdbDownloader.Logic.Pe.Structures
|
||||||
|
{
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Size = 8)]
|
||||||
|
public struct SYSTEM_MODULE_INFORMATION
|
||||||
|
{
|
||||||
|
public uint NumberOfModules;
|
||||||
|
}
|
||||||
|
}
|
45
PdbServer/PdbPaeser/BasicType.cs
Normal file
45
PdbServer/PdbPaeser/BasicType.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000012 RID: 18
|
||||||
|
public enum BasicType
|
||||||
|
{
|
||||||
|
// Token: 0x0400005A RID: 90
|
||||||
|
NoType,
|
||||||
|
// Token: 0x0400005B RID: 91
|
||||||
|
Void,
|
||||||
|
// Token: 0x0400005C RID: 92
|
||||||
|
Char,
|
||||||
|
// Token: 0x0400005D RID: 93
|
||||||
|
WChar,
|
||||||
|
// Token: 0x0400005E RID: 94
|
||||||
|
Int = 6,
|
||||||
|
// Token: 0x0400005F RID: 95
|
||||||
|
UInt,
|
||||||
|
// Token: 0x04000060 RID: 96
|
||||||
|
Float,
|
||||||
|
// Token: 0x04000061 RID: 97
|
||||||
|
BCD,
|
||||||
|
// Token: 0x04000062 RID: 98
|
||||||
|
Bool,
|
||||||
|
// Token: 0x04000063 RID: 99
|
||||||
|
Long = 13,
|
||||||
|
// Token: 0x04000064 RID: 100
|
||||||
|
ULong,
|
||||||
|
// Token: 0x04000065 RID: 101
|
||||||
|
Currency = 25,
|
||||||
|
// Token: 0x04000066 RID: 102
|
||||||
|
Date,
|
||||||
|
// Token: 0x04000067 RID: 103
|
||||||
|
Variant,
|
||||||
|
// Token: 0x04000068 RID: 104
|
||||||
|
Complex,
|
||||||
|
// Token: 0x04000069 RID: 105
|
||||||
|
Bit,
|
||||||
|
// Token: 0x0400006A RID: 106
|
||||||
|
BSTR,
|
||||||
|
// Token: 0x0400006B RID: 107
|
||||||
|
Hresult
|
||||||
|
}
|
||||||
|
}
|
8
PdbServer/PdbPaeser/EnumSourceFilesCallback.cs
Normal file
8
PdbServer/PdbPaeser/EnumSourceFilesCallback.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000010 RID: 16
|
||||||
|
// (Invoke) Token: 0x0600004D RID: 77
|
||||||
|
internal delegate bool EnumSourceFilesCallback(SOURCEFILE sourceFile, IntPtr context);
|
||||||
|
}
|
20
PdbServer/PdbPaeser/Extensions.cs
Normal file
20
PdbServer/PdbPaeser/Extensions.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000004 RID: 4
|
||||||
|
internal static class Extensions
|
||||||
|
{
|
||||||
|
// Token: 0x06000003 RID: 3 RVA: 0x00002058 File Offset: 0x00000258
|
||||||
|
public static bool ThrowIfWin32Failed(this bool ok, int error = 0)
|
||||||
|
{
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
throw new Win32Exception((error != 0) ? error : Marshal.GetLastWin32Error());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
PdbServer/PdbPaeser/FindChildrenParams.cs
Normal file
19
PdbServer/PdbPaeser/FindChildrenParams.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000016 RID: 22
|
||||||
|
internal struct FindChildrenParams
|
||||||
|
{
|
||||||
|
// Token: 0x040000C0 RID: 192
|
||||||
|
public int Count;
|
||||||
|
|
||||||
|
// Token: 0x040000C1 RID: 193
|
||||||
|
public int Start;
|
||||||
|
|
||||||
|
// Token: 0x040000C2 RID: 194
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 400)]
|
||||||
|
public int[] Child;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
|
18
PdbServer/PdbPaeser/ModuleInfo.cs
Normal file
18
PdbServer/PdbPaeser/ModuleInfo.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000005 RID: 5
|
||||||
|
public sealed class ModuleInfo
|
||||||
|
{
|
||||||
|
// Token: 0x17000001 RID: 1
|
||||||
|
// (get) Token: 0x06000004 RID: 4 RVA: 0x0000206F File Offset: 0x0000026F
|
||||||
|
// (set) Token: 0x06000005 RID: 5 RVA: 0x00002077 File Offset: 0x00000277
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
// Token: 0x17000002 RID: 2
|
||||||
|
// (get) Token: 0x06000006 RID: 6 RVA: 0x00002080 File Offset: 0x00000280
|
||||||
|
// (set) Token: 0x06000007 RID: 7 RVA: 0x00002088 File Offset: 0x00000288
|
||||||
|
public ulong Base { get; set; }
|
||||||
|
}
|
||||||
|
}
|
11
PdbServer/PdbPaeser/ProcessAccessMask.cs
Normal file
11
PdbServer/PdbPaeser/ProcessAccessMask.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000E RID: 14
|
||||||
|
internal enum ProcessAccessMask : uint
|
||||||
|
{
|
||||||
|
// Token: 0x04000056 RID: 86
|
||||||
|
Query = 1024U
|
||||||
|
}
|
||||||
|
}
|
16
PdbServer/PdbPaeser/SOURCEFILE.2.cs
Normal file
16
PdbServer/PdbPaeser/SOURCEFILE.2.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000011 RID: 17
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
public struct SOURCEFILE
|
||||||
|
{
|
||||||
|
// Token: 0x04000057 RID: 87
|
||||||
|
public ulong ModuleBase;
|
||||||
|
|
||||||
|
// Token: 0x04000058 RID: 88
|
||||||
|
public unsafe char* FileName;
|
||||||
|
}
|
||||||
|
}
|
18
PdbServer/PdbPaeser/SourceFile.cs
Normal file
18
PdbServer/PdbPaeser/SourceFile.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000006 RID: 6
|
||||||
|
public class SourceFile
|
||||||
|
{
|
||||||
|
// Token: 0x17000003 RID: 3
|
||||||
|
// (get) Token: 0x06000009 RID: 9 RVA: 0x00002099 File Offset: 0x00000299
|
||||||
|
// (set) Token: 0x0600000A RID: 10 RVA: 0x000020A1 File Offset: 0x000002A1
|
||||||
|
public ulong BaseAddress { get; set; }
|
||||||
|
|
||||||
|
// Token: 0x17000004 RID: 4
|
||||||
|
// (get) Token: 0x0600000B RID: 11 RVA: 0x000020AA File Offset: 0x000002AA
|
||||||
|
// (set) Token: 0x0600000C RID: 12 RVA: 0x000020B2 File Offset: 0x000002B2
|
||||||
|
public string FileName { get; set; }
|
||||||
|
}
|
||||||
|
}
|
23
PdbServer/PdbPaeser/SourceFileLine.cs
Normal file
23
PdbServer/PdbPaeser/SourceFileLine.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000007 RID: 7
|
||||||
|
public class SourceFileLine
|
||||||
|
{
|
||||||
|
// Token: 0x17000005 RID: 5
|
||||||
|
// (get) Token: 0x0600000E RID: 14 RVA: 0x000020BB File Offset: 0x000002BB
|
||||||
|
public SourceFile SourceFile { get; }
|
||||||
|
|
||||||
|
// Token: 0x17000006 RID: 6
|
||||||
|
// (get) Token: 0x0600000F RID: 15 RVA: 0x000020C3 File Offset: 0x000002C3
|
||||||
|
public string Line { get; }
|
||||||
|
|
||||||
|
// Token: 0x06000010 RID: 16 RVA: 0x000020CB File Offset: 0x000002CB
|
||||||
|
public SourceFileLine(SourceFile file, string line)
|
||||||
|
{
|
||||||
|
this.SourceFile = file;
|
||||||
|
this.Line = line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
89
PdbServer/PdbPaeser/StructDescriptor.cs
Normal file
89
PdbServer/PdbPaeser/StructDescriptor.cs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000009 RID: 9
|
||||||
|
public sealed class StructDescriptor : IReadOnlyList<StructMember>, IReadOnlyCollection<StructMember>, IEnumerable<StructMember>, IEnumerable
|
||||||
|
{
|
||||||
|
// Token: 0x06000019 RID: 25 RVA: 0x000021BA File Offset: 0x000003BA
|
||||||
|
internal StructDescriptor(int capacity = 8)
|
||||||
|
{
|
||||||
|
this._membersByName = new Dictionary<string, StructMember>(capacity, StringComparer.InvariantCultureIgnoreCase);
|
||||||
|
this._members = new List<StructMember>(capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600001A RID: 26 RVA: 0x000021E0 File Offset: 0x000003E0
|
||||||
|
public int GetOffsetOf(string memberName)
|
||||||
|
{
|
||||||
|
StructMember structMember;
|
||||||
|
if (!this._membersByName.TryGetValue(memberName, out structMember))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return structMember.Offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600001B RID: 27 RVA: 0x00002208 File Offset: 0x00000408
|
||||||
|
public StructMember GetMember(string memberName)
|
||||||
|
{
|
||||||
|
StructMember result;
|
||||||
|
if (!this._membersByName.TryGetValue(memberName, out result))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x1700000B RID: 11
|
||||||
|
// (get) Token: 0x0600001C RID: 28 RVA: 0x00002228 File Offset: 0x00000428
|
||||||
|
// (set) Token: 0x0600001D RID: 29 RVA: 0x00002230 File Offset: 0x00000430
|
||||||
|
public int Length { get; internal set; }
|
||||||
|
|
||||||
|
// Token: 0x1700000C RID: 12
|
||||||
|
// (get) Token: 0x0600001E RID: 30 RVA: 0x00002239 File Offset: 0x00000439
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this._members.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x1700000D RID: 13
|
||||||
|
public StructMember this[int index]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this._members[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000020 RID: 32 RVA: 0x00002254 File Offset: 0x00000454
|
||||||
|
public void AddMember(StructMember member)
|
||||||
|
{
|
||||||
|
member.Parent = this;
|
||||||
|
this._membersByName.Add(member.Symbol.Name, member);
|
||||||
|
this._members.Add(member);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000021 RID: 33 RVA: 0x00002280 File Offset: 0x00000480
|
||||||
|
public IEnumerator<StructMember> GetEnumerator()
|
||||||
|
{
|
||||||
|
return this._members.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000022 RID: 34 RVA: 0x00002292 File Offset: 0x00000492
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return this.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0400000B RID: 11
|
||||||
|
private readonly Dictionary<string, StructMember> _membersByName;
|
||||||
|
|
||||||
|
// Token: 0x0400000C RID: 12
|
||||||
|
private readonly List<StructMember> _members;
|
||||||
|
}
|
||||||
|
}
|
82
PdbServer/PdbPaeser/StructMember.cs
Normal file
82
PdbServer/PdbPaeser/StructMember.cs
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000008 RID: 8
|
||||||
|
[DebuggerDisplay("{Name,nq} offset={Offset,d} size={Size,d}")]
|
||||||
|
public sealed class StructMember
|
||||||
|
{
|
||||||
|
// Token: 0x17000007 RID: 7
|
||||||
|
// (get) Token: 0x06000011 RID: 17 RVA: 0x000020E1 File Offset: 0x000002E1
|
||||||
|
// (set) Token: 0x06000012 RID: 18 RVA: 0x000020E9 File Offset: 0x000002E9
|
||||||
|
public StructDescriptor Parent { get; internal set; }
|
||||||
|
|
||||||
|
// Token: 0x17000008 RID: 8
|
||||||
|
// (get) Token: 0x06000013 RID: 19 RVA: 0x000020F2 File Offset: 0x000002F2
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Symbol.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x17000009 RID: 9
|
||||||
|
// (get) Token: 0x06000014 RID: 20 RVA: 0x000020FF File Offset: 0x000002FF
|
||||||
|
public int Size
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Symbol.Size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000015 RID: 21 RVA: 0x0000210C File Offset: 0x0000030C
|
||||||
|
public StructMember(ref SymbolInfo symbol, int offset)
|
||||||
|
{
|
||||||
|
this.Symbol = symbol;
|
||||||
|
this.Offset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000016 RID: 22 RVA: 0x00002127 File Offset: 0x00000327
|
||||||
|
public StructMember Clone()
|
||||||
|
{
|
||||||
|
StructMember structMember = (StructMember)base.MemberwiseClone();
|
||||||
|
structMember.Parent = null;
|
||||||
|
return structMember;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x1700000A RID: 10
|
||||||
|
// (get) Token: 0x06000017 RID: 23 RVA: 0x0000213B File Offset: 0x0000033B
|
||||||
|
public int TypeId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Symbol.TypeIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000018 RID: 24 RVA: 0x00002148 File Offset: 0x00000348
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("{0}, size={1}, offset={2}, typeid={3} tag={4}", new object[]
|
||||||
|
{
|
||||||
|
this.Symbol.Name,
|
||||||
|
this.Symbol.Size,
|
||||||
|
this.Offset,
|
||||||
|
this.Symbol.TypeIndex,
|
||||||
|
this.Symbol.Tag
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x04000007 RID: 7
|
||||||
|
public readonly int Offset;
|
||||||
|
|
||||||
|
// Token: 0x04000009 RID: 9
|
||||||
|
public readonly SymbolInfo Symbol;
|
||||||
|
|
||||||
|
// Token: 0x0400000A RID: 10
|
||||||
|
public long Value;
|
||||||
|
}
|
||||||
|
}
|
8
PdbServer/PdbPaeser/SymEnumerateModuleProc.cs
Normal file
8
PdbServer/PdbPaeser/SymEnumerateModuleProc.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000F RID: 15
|
||||||
|
// (Invoke) Token: 0x06000049 RID: 73
|
||||||
|
internal delegate bool SymEnumerateModuleProc(string module, ulong dllBase, IntPtr context);
|
||||||
|
}
|
54
PdbServer/PdbPaeser/SymbolFlags.cs
Normal file
54
PdbServer/PdbPaeser/SymbolFlags.cs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000B RID: 11
|
||||||
|
[Flags]
|
||||||
|
public enum SymbolFlags : uint
|
||||||
|
{
|
||||||
|
// Token: 0x04000012 RID: 18
|
||||||
|
None = 0U,
|
||||||
|
// Token: 0x04000013 RID: 19
|
||||||
|
ClrToken = 262144U,
|
||||||
|
// Token: 0x04000014 RID: 20
|
||||||
|
Constant = 256U,
|
||||||
|
// Token: 0x04000015 RID: 21
|
||||||
|
Export = 512U,
|
||||||
|
// Token: 0x04000016 RID: 22
|
||||||
|
Forwarder = 1024U,
|
||||||
|
// Token: 0x04000017 RID: 23
|
||||||
|
FrameRelative = 32U,
|
||||||
|
// Token: 0x04000018 RID: 24
|
||||||
|
Function = 2048U,
|
||||||
|
// Token: 0x04000019 RID: 25
|
||||||
|
ILRelative = 65536U,
|
||||||
|
// Token: 0x0400001A RID: 26
|
||||||
|
Local = 128U,
|
||||||
|
// Token: 0x0400001B RID: 27
|
||||||
|
Metadata = 131072U,
|
||||||
|
// Token: 0x0400001C RID: 28
|
||||||
|
Parameter = 64U,
|
||||||
|
// Token: 0x0400001D RID: 29
|
||||||
|
Register = 8U,
|
||||||
|
// Token: 0x0400001E RID: 30
|
||||||
|
RegisterRelative = 16U,
|
||||||
|
// Token: 0x0400001F RID: 31
|
||||||
|
Slot = 32768U,
|
||||||
|
// Token: 0x04000020 RID: 32
|
||||||
|
Thunk = 8192U,
|
||||||
|
// Token: 0x04000021 RID: 33
|
||||||
|
TLSRelative = 16384U,
|
||||||
|
// Token: 0x04000022 RID: 34
|
||||||
|
ValuePresent = 1U,
|
||||||
|
// Token: 0x04000023 RID: 35
|
||||||
|
Virtual = 4096U,
|
||||||
|
// Token: 0x04000024 RID: 36
|
||||||
|
Null = 524288U,
|
||||||
|
// Token: 0x04000025 RID: 37
|
||||||
|
FunctionNoReturn = 1048576U,
|
||||||
|
// Token: 0x04000026 RID: 38
|
||||||
|
SyntheticZeroBase = 2097152U,
|
||||||
|
// Token: 0x04000027 RID: 39
|
||||||
|
PublicCode = 4194304U
|
||||||
|
}
|
||||||
|
}
|
438
PdbServer/PdbPaeser/SymbolHandler.cs
Normal file
438
PdbServer/PdbPaeser/SymbolHandler.cs
Normal file
@ -0,0 +1,438 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000A RID: 10
|
||||||
|
public sealed class SymbolHandler : IDisposable
|
||||||
|
{
|
||||||
|
// Token: 0x06000023 RID: 35 RVA: 0x0000229A File Offset: 0x0000049A
|
||||||
|
private SymbolHandler(IntPtr hProcess, bool ownHandle)
|
||||||
|
{
|
||||||
|
this._hProcess = hProcess;
|
||||||
|
this._ownHandle = ownHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000024 RID: 36 RVA: 0x000022B0 File Offset: 0x000004B0
|
||||||
|
public static SymbolHandler CreateFromProcess(int pid, SymbolOptions options = SymbolOptions.None, string searchPath = null)
|
||||||
|
{
|
||||||
|
if (searchPath == null)
|
||||||
|
{
|
||||||
|
searchPath = SymbolHandler.GetDefaultSearchPath();
|
||||||
|
}
|
||||||
|
IntPtr hProcess = new IntPtr(pid);
|
||||||
|
if (Win32.SymInitialize(hProcess, searchPath, true))
|
||||||
|
{
|
||||||
|
return new SymbolHandler(hProcess, false);
|
||||||
|
}
|
||||||
|
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000025 RID: 37 RVA: 0x000022EC File Offset: 0x000004EC
|
||||||
|
public static SymbolHandler TryCreateFromProcess(int pid, SymbolOptions options = SymbolOptions.None, string searchPath = null)
|
||||||
|
{
|
||||||
|
if (searchPath == null)
|
||||||
|
{
|
||||||
|
searchPath = SymbolHandler.GetDefaultSearchPath();
|
||||||
|
}
|
||||||
|
IntPtr hProcess = new IntPtr(pid);
|
||||||
|
if (Win32.SymInitialize(hProcess, searchPath, true))
|
||||||
|
{
|
||||||
|
return new SymbolHandler(hProcess, false);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000026 RID: 38 RVA: 0x0000231E File Offset: 0x0000051E
|
||||||
|
public static SymbolHandler CreateFromHandle(IntPtr handle, SymbolOptions options = SymbolOptions.None, string searchPath = null)
|
||||||
|
{
|
||||||
|
if (searchPath == null)
|
||||||
|
{
|
||||||
|
searchPath = SymbolHandler.GetDefaultSearchPath();
|
||||||
|
}
|
||||||
|
Win32.SymSetOptions(options);
|
||||||
|
Win32.SymInitialize(handle, searchPath, true).ThrowIfWin32Failed(0);
|
||||||
|
return new SymbolHandler(handle, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000027 RID: 39 RVA: 0x00002348 File Offset: 0x00000548
|
||||||
|
private static string GetDefaultSearchPath()
|
||||||
|
{
|
||||||
|
string text = Environment.GetEnvironmentVariable("_NT_SYMBOL_PATH");
|
||||||
|
if (text != null)
|
||||||
|
{
|
||||||
|
int num = text.IndexOf('*');
|
||||||
|
if (num < 0)
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
text = text.Substring(num + 1, text.IndexOf('*', num + 1) - num - 1);
|
||||||
|
if (string.IsNullOrWhiteSpace(text))
|
||||||
|
{
|
||||||
|
text = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000028 RID: 40 RVA: 0x0000239C File Offset: 0x0000059C
|
||||||
|
public static SymbolHandler Create(SymbolOptions options = SymbolOptions.CaseInsensitive | SymbolOptions.UndecorateNames, string searchPath = null)
|
||||||
|
{
|
||||||
|
if (Debugger.IsAttached)
|
||||||
|
{
|
||||||
|
options |= (SymbolOptions)2147483648U;
|
||||||
|
}
|
||||||
|
if (searchPath == null)
|
||||||
|
{
|
||||||
|
searchPath = SymbolHandler.GetDefaultSearchPath();
|
||||||
|
}
|
||||||
|
Win32.SymSetOptions(options);
|
||||||
|
IntPtr hProcess = new IntPtr(++SymbolHandler._instances);
|
||||||
|
Win32.SymInitialize(hProcess, searchPath, false).ThrowIfWin32Failed(0);
|
||||||
|
return new SymbolHandler(hProcess, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000029 RID: 41 RVA: 0x000023F1 File Offset: 0x000005F1
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Win32.SymCleanup(this._hProcess);
|
||||||
|
if (this._ownHandle)
|
||||||
|
{
|
||||||
|
Win32.CloseHandle(this._hProcess);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002A RID: 42 RVA: 0x00002414 File Offset: 0x00000614
|
||||||
|
public ulong LoadSymbolsForModule(string imageName, ulong dllBase = 0UL, string moduleName = null, IntPtr? hFile = null)
|
||||||
|
{
|
||||||
|
ulong num = Win32.SymLoadModuleEx(this._hProcess, hFile ?? IntPtr.Zero, imageName, moduleName, dllBase, 0U, IntPtr.Zero, 0U);
|
||||||
|
int lastWin32Error = Marshal.GetLastWin32Error();
|
||||||
|
if (num == 0UL && lastWin32Error != 0)
|
||||||
|
{
|
||||||
|
throw new Win32Exception(lastWin32Error);
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002B RID: 43 RVA: 0x00002464 File Offset: 0x00000664
|
||||||
|
public ulong TryLoadSymbolsForModule(string imageName, string moduleName = null, IntPtr? hFile = null)
|
||||||
|
{
|
||||||
|
return Win32.SymLoadModuleEx(this._hProcess, hFile ?? IntPtr.Zero, imageName, moduleName, 0UL, 0U, IntPtr.Zero, 0U);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002C RID: 44 RVA: 0x000024A0 File Offset: 0x000006A0
|
||||||
|
public Task<ulong> TryLoadSymbolsForModuleAsync(string imageName, ulong dllBase = 0UL, string moduleName = null, IntPtr? hFile = null)
|
||||||
|
{
|
||||||
|
return Task.Run<ulong>(() => Win32.SymLoadModuleEx(this._hProcess, hFile ?? IntPtr.Zero, imageName, moduleName, dllBase, 0U, IntPtr.Zero, 0U));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002D RID: 45 RVA: 0x000024DC File Offset: 0x000006DC
|
||||||
|
public SymbolInfo GetSymbolFromAddress(ulong address, out ulong displacement)
|
||||||
|
{
|
||||||
|
SymbolInfo result = default(SymbolInfo);
|
||||||
|
result.Init();
|
||||||
|
Win32.SymFromAddr(this._hProcess, address, out displacement, ref result).ThrowIfWin32Failed(0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002E RID: 46 RVA: 0x0000250F File Offset: 0x0000070F
|
||||||
|
public bool TryGetSymbolFromAddress(ulong address, ref SymbolInfo symbol, out ulong displacement)
|
||||||
|
{
|
||||||
|
symbol.Init();
|
||||||
|
return Win32.SymFromAddr(this._hProcess, address, out displacement, ref symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600002F RID: 47 RVA: 0x00002528 File Offset: 0x00000728
|
||||||
|
public IReadOnlyList<ModuleInfo> EnumModules()
|
||||||
|
{
|
||||||
|
List<ModuleInfo> modules = new List<ModuleInfo>(8);
|
||||||
|
Win32.SymEnumerateModules64(this._hProcess, delegate(string name, ulong dllBase, IntPtr context)
|
||||||
|
{
|
||||||
|
modules.Add(new ModuleInfo
|
||||||
|
{
|
||||||
|
Name = name,
|
||||||
|
Base = dllBase
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}, IntPtr.Zero).ThrowIfWin32Failed(0);
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000030 RID: 48 RVA: 0x00002570 File Offset: 0x00000770
|
||||||
|
public bool GetSymbolFromName(string name, ref SymbolInfo symbol)
|
||||||
|
{
|
||||||
|
return Win32.SymFromName(this._hProcess, name, ref symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000031 RID: 49 RVA: 0x0000257F File Offset: 0x0000077F
|
||||||
|
public bool GetSymbolFromIndex(ulong dllBase, int index, ref SymbolInfo symbol)
|
||||||
|
{
|
||||||
|
return Win32.SymFromIndex(this._hProcess, dllBase, index, ref symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000032 RID: 50 RVA: 0x00002590 File Offset: 0x00000790
|
||||||
|
public ICollection<SymbolInfo> EnumSymbols(ulong baseAddress, string mask = "*!*")
|
||||||
|
{
|
||||||
|
List<SymbolInfo> symbols = new List<SymbolInfo>(16);
|
||||||
|
Win32.SymEnumSymbols(this._hProcess, baseAddress, mask, delegate(ref SymbolInfo symbol, uint size, IntPtr context)
|
||||||
|
{
|
||||||
|
symbols.Add(symbol);
|
||||||
|
return true;
|
||||||
|
}, IntPtr.Zero);
|
||||||
|
return symbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000033 RID: 51 RVA: 0x000025D8 File Offset: 0x000007D8
|
||||||
|
public IList<SymbolInfo> EnumTypes(ulong baseAddress, string mask = "*")
|
||||||
|
{
|
||||||
|
List<SymbolInfo> symbols = new List<SymbolInfo>(16);
|
||||||
|
Win32.SymEnumTypesByName(this._hProcess, baseAddress, mask, delegate(ref SymbolInfo symbol, uint size, IntPtr context)
|
||||||
|
{
|
||||||
|
symbols.Add(symbol);
|
||||||
|
return true;
|
||||||
|
}, IntPtr.Zero);
|
||||||
|
return symbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000034 RID: 52 RVA: 0x00002620 File Offset: 0x00000820
|
||||||
|
public unsafe IList<SourceFile> EnumSourceFiles(ulong baseAddress, string mask = "*")
|
||||||
|
{
|
||||||
|
List<SourceFile> files = new List<SourceFile>(4);
|
||||||
|
Win32.SymEnumSourceFiles(this._hProcess, baseAddress, mask, delegate(SOURCEFILE source, IntPtr context)
|
||||||
|
{
|
||||||
|
files.Add(new SourceFile
|
||||||
|
{
|
||||||
|
BaseAddress = source.ModuleBase,
|
||||||
|
FileName = new string(source.FileName)
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}, IntPtr.Zero);
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000035 RID: 53 RVA: 0x00002664 File Offset: 0x00000864
|
||||||
|
public int GetTypeIndexFromName(ulong baseAddress, string name)
|
||||||
|
{
|
||||||
|
SymbolInfo symbolInfo = SymbolInfo.Create();
|
||||||
|
if (!Win32.SymGetTypeFromName(this._hProcess, baseAddress, name, ref symbolInfo))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return symbolInfo.TypeIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000036 RID: 54 RVA: 0x00002690 File Offset: 0x00000890
|
||||||
|
public bool GetTypeFromName(ulong baseAddress, string name, ref SymbolInfo type)
|
||||||
|
{
|
||||||
|
return Win32.SymGetTypeFromName(this._hProcess, baseAddress, name, ref type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000037 RID: 55 RVA: 0x000026A0 File Offset: 0x000008A0
|
||||||
|
public bool Refresh()
|
||||||
|
{
|
||||||
|
return Win32.SymRefreshModuleList(this._hProcess);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000038 RID: 56 RVA: 0x000026B0 File Offset: 0x000008B0
|
||||||
|
public unsafe string GetTypeInfoName(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
char* value;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Name, out value))
|
||||||
|
{
|
||||||
|
string result = new string(value);
|
||||||
|
Marshal.FreeCoTaskMem(new IntPtr((void*)value));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000039 RID: 57 RVA: 0x000026E4 File Offset: 0x000008E4
|
||||||
|
public SymbolTag GetSymbolTag(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
SymbolTag result = SymbolTag.Null;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Tag, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003A RID: 58 RVA: 0x00002708 File Offset: 0x00000908
|
||||||
|
public Variant GetSymbolValue(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
Variant result = default(Variant);
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Value, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003B RID: 59 RVA: 0x00002730 File Offset: 0x00000930
|
||||||
|
public ulong GetSymbolLength(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
ulong result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Length, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003C RID: 60 RVA: 0x00002750 File Offset: 0x00000950
|
||||||
|
public int GetSymbolDataKind(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.DataKind, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003D RID: 61 RVA: 0x00002770 File Offset: 0x00000970
|
||||||
|
public UdtKind GetSymbolUdtKind(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.UdtKind, out result))
|
||||||
|
{
|
||||||
|
return (UdtKind)result;
|
||||||
|
}
|
||||||
|
return UdtKind.Unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003E RID: 62 RVA: 0x00002794 File Offset: 0x00000994
|
||||||
|
public int GetSymbolType(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Type, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0600003F RID: 63 RVA: 0x000027B4 File Offset: 0x000009B4
|
||||||
|
public int GetSymbolBitPosition(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.BitPosition, out result))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000040 RID: 64 RVA: 0x000027D8 File Offset: 0x000009D8
|
||||||
|
public int GetSymbolCount(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result = -1;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Count, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000041 RID: 65 RVA: 0x000027FC File Offset: 0x000009FC
|
||||||
|
public int GetSymbolAddressOffset(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.AddressOffset, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000042 RID: 66 RVA: 0x0000281C File Offset: 0x00000A1C
|
||||||
|
public BasicType GetSymbolBaseType(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.BaseType, out result);
|
||||||
|
return (BasicType)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000043 RID: 67 RVA: 0x0000283C File Offset: 0x00000A3C
|
||||||
|
public int GetSymbolOffset(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Offset, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000044 RID: 68 RVA: 0x0000285C File Offset: 0x00000A5C
|
||||||
|
public int GetSymbolChildrenCount(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.ChildrenCount, out result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000045 RID: 69 RVA: 0x0000287C File Offset: 0x00000A7C
|
||||||
|
public StructDescriptor BuildStructDescriptor(ulong dllBase, int typeIndex)
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.ChildrenCount, out num))
|
||||||
|
{
|
||||||
|
StructDescriptor structDescriptor = new StructDescriptor(num);
|
||||||
|
ulong num2;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.Length, out num2))
|
||||||
|
{
|
||||||
|
structDescriptor.Length = (int)num2;
|
||||||
|
}
|
||||||
|
FindChildrenParams findChildrenParams = new FindChildrenParams
|
||||||
|
{
|
||||||
|
Count = num
|
||||||
|
};
|
||||||
|
structDescriptor.Length = (int)num2;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, typeIndex, SymbolTypeInfo.FindChildren, ref findChildrenParams))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < findChildrenParams.Count; i++)
|
||||||
|
{
|
||||||
|
SymbolInfo symbolInfo = SymbolInfo.Create();
|
||||||
|
int num3 = findChildrenParams.Child[i];
|
||||||
|
if (this.GetSymbolFromIndex(dllBase, num3, ref symbolInfo))
|
||||||
|
{
|
||||||
|
int offset;
|
||||||
|
SymbolTag tag;
|
||||||
|
Variant variant;
|
||||||
|
if (Win32.SymGetTypeInfo(this._hProcess, dllBase, num3, SymbolTypeInfo.Offset, out offset) && Win32.SymGetTypeInfo(this._hProcess, dllBase, num3, SymbolTypeInfo.Tag, out tag))
|
||||||
|
{
|
||||||
|
symbolInfo.Tag = tag;
|
||||||
|
symbolInfo.TypeIndex = num3;
|
||||||
|
StructMember member = new StructMember(ref symbolInfo, offset);
|
||||||
|
structDescriptor.AddMember(member);
|
||||||
|
}
|
||||||
|
else if (Win32.SymGetTypeInfo(this._hProcess, dllBase, num3, SymbolTypeInfo.Value, out variant))
|
||||||
|
{
|
||||||
|
symbolInfo.Tag = SymbolTag.Enum;
|
||||||
|
symbolInfo.Value = variant.lValue;
|
||||||
|
symbolInfo.TypeIndex = num3;
|
||||||
|
StructMember structMember = new StructMember(ref symbolInfo, 0);
|
||||||
|
int size = symbolInfo.Size;
|
||||||
|
if (size != 1)
|
||||||
|
{
|
||||||
|
if (size != 2)
|
||||||
|
{
|
||||||
|
if (size == 8)
|
||||||
|
{
|
||||||
|
structMember.Value = variant.lValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
structMember.Value = (long)variant.iValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
structMember.Value = (long)variant.sValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
structMember.Value = (long)((ulong)variant.bValue);
|
||||||
|
}
|
||||||
|
structDescriptor.AddMember(structMember);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return structDescriptor;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x0400000E RID: 14
|
||||||
|
private static int _instances;
|
||||||
|
|
||||||
|
// Token: 0x0400000F RID: 15
|
||||||
|
private IntPtr _hProcess;
|
||||||
|
|
||||||
|
// Token: 0x04000010 RID: 16
|
||||||
|
private bool _ownHandle;
|
||||||
|
}
|
||||||
|
}
|
76
PdbServer/PdbPaeser/SymbolInfo.cs
Normal file
76
PdbServer/PdbPaeser/SymbolInfo.cs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000C RID: 12
|
||||||
|
public struct SymbolInfo
|
||||||
|
{
|
||||||
|
// Token: 0x06000046 RID: 70 RVA: 0x00002A24 File Offset: 0x00000C24
|
||||||
|
public static SymbolInfo Create()
|
||||||
|
{
|
||||||
|
SymbolInfo result = default(SymbolInfo);
|
||||||
|
result.Init();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x06000047 RID: 71 RVA: 0x00002A41 File Offset: 0x00000C41
|
||||||
|
public void Init()
|
||||||
|
{
|
||||||
|
this.MaxNameLen = 500;
|
||||||
|
this.SizeOfStruct = 88;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x04000028 RID: 40
|
||||||
|
private const int MaxSymbolLen = 500;
|
||||||
|
|
||||||
|
// Token: 0x04000029 RID: 41
|
||||||
|
public int SizeOfStruct;
|
||||||
|
|
||||||
|
// Token: 0x0400002A RID: 42
|
||||||
|
public int TypeIndex;
|
||||||
|
|
||||||
|
// Token: 0x0400002B RID: 43
|
||||||
|
private readonly ulong Reserved1;
|
||||||
|
|
||||||
|
// Token: 0x0400002C RID: 44
|
||||||
|
private readonly ulong Reserved2;
|
||||||
|
|
||||||
|
// Token: 0x0400002D RID: 45
|
||||||
|
public int Index;
|
||||||
|
|
||||||
|
// Token: 0x0400002E RID: 46
|
||||||
|
public int Size;
|
||||||
|
|
||||||
|
// Token: 0x0400002F RID: 47
|
||||||
|
public ulong ModuleBase;
|
||||||
|
|
||||||
|
// Token: 0x04000030 RID: 48
|
||||||
|
public SymbolFlags Flags;
|
||||||
|
|
||||||
|
// Token: 0x04000031 RID: 49
|
||||||
|
public long Value;
|
||||||
|
|
||||||
|
// Token: 0x04000032 RID: 50
|
||||||
|
public ulong Address;
|
||||||
|
|
||||||
|
// Token: 0x04000033 RID: 51
|
||||||
|
public uint Register;
|
||||||
|
|
||||||
|
// Token: 0x04000034 RID: 52
|
||||||
|
public uint Scope;
|
||||||
|
|
||||||
|
// Token: 0x04000035 RID: 53
|
||||||
|
public SymbolTag Tag;
|
||||||
|
|
||||||
|
// Token: 0x04000036 RID: 54
|
||||||
|
public uint NameLen;
|
||||||
|
|
||||||
|
// Token: 0x04000037 RID: 55
|
||||||
|
public int MaxNameLen;
|
||||||
|
|
||||||
|
// Token: 0x04000038 RID: 56
|
||||||
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 500)]
|
||||||
|
public string Name;
|
||||||
|
}
|
||||||
|
}
|
64
PdbServer/PdbPaeser/SymbolOptions.cs
Normal file
64
PdbServer/PdbPaeser/SymbolOptions.cs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x0200000D RID: 13
|
||||||
|
[Flags]
|
||||||
|
public enum SymbolOptions : uint
|
||||||
|
{
|
||||||
|
// Token: 0x0400003A RID: 58
|
||||||
|
None = 0U,
|
||||||
|
// Token: 0x0400003B RID: 59
|
||||||
|
AllowAbsoluteSymbols = 2048U,
|
||||||
|
// Token: 0x0400003C RID: 60
|
||||||
|
AllowZeroAddress = 16777216U,
|
||||||
|
// Token: 0x0400003D RID: 61
|
||||||
|
AutoPublics = 65536U,
|
||||||
|
// Token: 0x0400003E RID: 62
|
||||||
|
CaseInsensitive = 1U,
|
||||||
|
// Token: 0x0400003F RID: 63
|
||||||
|
Debug = 2147483648U,
|
||||||
|
// Token: 0x04000040 RID: 64
|
||||||
|
DeferredLoads = 4U,
|
||||||
|
// Token: 0x04000041 RID: 65
|
||||||
|
DisableSymSrvAutoDetect = 33554432U,
|
||||||
|
// Token: 0x04000042 RID: 66
|
||||||
|
ExactSymbols = 1024U,
|
||||||
|
// Token: 0x04000043 RID: 67
|
||||||
|
FailCriticalErrors = 512U,
|
||||||
|
// Token: 0x04000044 RID: 68
|
||||||
|
FavorCompressed = 8388608U,
|
||||||
|
// Token: 0x04000045 RID: 69
|
||||||
|
FlatDirectory = 4194304U,
|
||||||
|
// Token: 0x04000046 RID: 70
|
||||||
|
IgnoreCodeViewRecord = 128U,
|
||||||
|
// Token: 0x04000047 RID: 71
|
||||||
|
IgnoreImageDir = 2097152U,
|
||||||
|
// Token: 0x04000048 RID: 72
|
||||||
|
IgnoreNTSymbolPath = 4096U,
|
||||||
|
// Token: 0x04000049 RID: 73
|
||||||
|
Include32BitModules = 8192U,
|
||||||
|
// Token: 0x0400004A RID: 74
|
||||||
|
LoadAnything = 64U,
|
||||||
|
// Token: 0x0400004B RID: 75
|
||||||
|
LoadLines = 16U,
|
||||||
|
// Token: 0x0400004C RID: 76
|
||||||
|
NoCPP = 8U,
|
||||||
|
// Token: 0x0400004D RID: 77
|
||||||
|
NoImageSearch = 131072U,
|
||||||
|
// Token: 0x0400004E RID: 78
|
||||||
|
NoPrompts = 524288U,
|
||||||
|
// Token: 0x0400004F RID: 79
|
||||||
|
NoPublics = 32768U,
|
||||||
|
// Token: 0x04000050 RID: 80
|
||||||
|
NoUnqualifiedLoads = 256U,
|
||||||
|
// Token: 0x04000051 RID: 81
|
||||||
|
Overwrite = 1048576U,
|
||||||
|
// Token: 0x04000052 RID: 82
|
||||||
|
PublicsOnly = 16384U,
|
||||||
|
// Token: 0x04000053 RID: 83
|
||||||
|
Secure = 262144U,
|
||||||
|
// Token: 0x04000054 RID: 84
|
||||||
|
UndecorateNames = 2U
|
||||||
|
}
|
||||||
|
}
|
95
PdbServer/PdbPaeser/SymbolTag.cs
Normal file
95
PdbServer/PdbPaeser/SymbolTag.cs
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000014 RID: 20
|
||||||
|
public enum SymbolTag
|
||||||
|
{
|
||||||
|
// Token: 0x04000073 RID: 115
|
||||||
|
Null,
|
||||||
|
// Token: 0x04000074 RID: 116
|
||||||
|
Exe,
|
||||||
|
// Token: 0x04000075 RID: 117
|
||||||
|
Compiland,
|
||||||
|
// Token: 0x04000076 RID: 118
|
||||||
|
CompilandDetails,
|
||||||
|
// Token: 0x04000077 RID: 119
|
||||||
|
CompilandEnv,
|
||||||
|
// Token: 0x04000078 RID: 120
|
||||||
|
Function,
|
||||||
|
// Token: 0x04000079 RID: 121
|
||||||
|
Block,
|
||||||
|
// Token: 0x0400007A RID: 122
|
||||||
|
Data,
|
||||||
|
// Token: 0x0400007B RID: 123
|
||||||
|
Annotation,
|
||||||
|
// Token: 0x0400007C RID: 124
|
||||||
|
Label,
|
||||||
|
// Token: 0x0400007D RID: 125
|
||||||
|
PublicSymbol,
|
||||||
|
// Token: 0x0400007E RID: 126
|
||||||
|
UDT,
|
||||||
|
// Token: 0x0400007F RID: 127
|
||||||
|
Enum,
|
||||||
|
// Token: 0x04000080 RID: 128
|
||||||
|
FunctionType,
|
||||||
|
// Token: 0x04000081 RID: 129
|
||||||
|
PointerType,
|
||||||
|
// Token: 0x04000082 RID: 130
|
||||||
|
ArrayType,
|
||||||
|
// Token: 0x04000083 RID: 131
|
||||||
|
BaseType,
|
||||||
|
// Token: 0x04000084 RID: 132
|
||||||
|
Typedef,
|
||||||
|
// Token: 0x04000085 RID: 133
|
||||||
|
BaseClass,
|
||||||
|
// Token: 0x04000086 RID: 134
|
||||||
|
Friend,
|
||||||
|
// Token: 0x04000087 RID: 135
|
||||||
|
FunctionArgType,
|
||||||
|
// Token: 0x04000088 RID: 136
|
||||||
|
FuncDebugStart,
|
||||||
|
// Token: 0x04000089 RID: 137
|
||||||
|
FuncDebugEnd,
|
||||||
|
// Token: 0x0400008A RID: 138
|
||||||
|
UsingNamespace,
|
||||||
|
// Token: 0x0400008B RID: 139
|
||||||
|
VTableShape,
|
||||||
|
// Token: 0x0400008C RID: 140
|
||||||
|
VTable,
|
||||||
|
// Token: 0x0400008D RID: 141
|
||||||
|
Custom,
|
||||||
|
// Token: 0x0400008E RID: 142
|
||||||
|
Thunk,
|
||||||
|
// Token: 0x0400008F RID: 143
|
||||||
|
CustomType,
|
||||||
|
// Token: 0x04000090 RID: 144
|
||||||
|
ManagedType,
|
||||||
|
// Token: 0x04000091 RID: 145
|
||||||
|
Dimension,
|
||||||
|
// Token: 0x04000092 RID: 146
|
||||||
|
CallSite,
|
||||||
|
// Token: 0x04000093 RID: 147
|
||||||
|
InlineSite,
|
||||||
|
// Token: 0x04000094 RID: 148
|
||||||
|
BaseInterface,
|
||||||
|
// Token: 0x04000095 RID: 149
|
||||||
|
VectorType,
|
||||||
|
// Token: 0x04000096 RID: 150
|
||||||
|
MatrixType,
|
||||||
|
// Token: 0x04000097 RID: 151
|
||||||
|
HLSLType,
|
||||||
|
// Token: 0x04000098 RID: 152
|
||||||
|
Caller,
|
||||||
|
// Token: 0x04000099 RID: 153
|
||||||
|
Callee,
|
||||||
|
// Token: 0x0400009A RID: 154
|
||||||
|
Export,
|
||||||
|
// Token: 0x0400009B RID: 155
|
||||||
|
HeapAllocationSite,
|
||||||
|
// Token: 0x0400009C RID: 156
|
||||||
|
CoffGroup,
|
||||||
|
// Token: 0x0400009D RID: 157
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
}
|
75
PdbServer/PdbPaeser/SymbolTypeInfo.cs
Normal file
75
PdbServer/PdbPaeser/SymbolTypeInfo.cs
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000015 RID: 21
|
||||||
|
public enum SymbolTypeInfo
|
||||||
|
{
|
||||||
|
// Token: 0x0400009F RID: 159
|
||||||
|
Tag,
|
||||||
|
// Token: 0x040000A0 RID: 160
|
||||||
|
Name,
|
||||||
|
// Token: 0x040000A1 RID: 161
|
||||||
|
Length,
|
||||||
|
// Token: 0x040000A2 RID: 162
|
||||||
|
Type,
|
||||||
|
// Token: 0x040000A3 RID: 163
|
||||||
|
TypeId,
|
||||||
|
// Token: 0x040000A4 RID: 164
|
||||||
|
BaseType,
|
||||||
|
// Token: 0x040000A5 RID: 165
|
||||||
|
ArrayIndexTypeId,
|
||||||
|
// Token: 0x040000A6 RID: 166
|
||||||
|
FindChildren,
|
||||||
|
// Token: 0x040000A7 RID: 167
|
||||||
|
DataKind,
|
||||||
|
// Token: 0x040000A8 RID: 168
|
||||||
|
AddressOffset,
|
||||||
|
// Token: 0x040000A9 RID: 169
|
||||||
|
Offset,
|
||||||
|
// Token: 0x040000AA RID: 170
|
||||||
|
Value,
|
||||||
|
// Token: 0x040000AB RID: 171
|
||||||
|
Count,
|
||||||
|
// Token: 0x040000AC RID: 172
|
||||||
|
ChildrenCount,
|
||||||
|
// Token: 0x040000AD RID: 173
|
||||||
|
BitPosition,
|
||||||
|
// Token: 0x040000AE RID: 174
|
||||||
|
VirtualBaseClass,
|
||||||
|
// Token: 0x040000AF RID: 175
|
||||||
|
VIRTUALTABLESHAPEID,
|
||||||
|
// Token: 0x040000B0 RID: 176
|
||||||
|
VIRTUALBASEPOINTEROFFSET,
|
||||||
|
// Token: 0x040000B1 RID: 177
|
||||||
|
ClassParentId,
|
||||||
|
// Token: 0x040000B2 RID: 178
|
||||||
|
Nested,
|
||||||
|
// Token: 0x040000B3 RID: 179
|
||||||
|
SymIndex,
|
||||||
|
// Token: 0x040000B4 RID: 180
|
||||||
|
LexicalParent,
|
||||||
|
// Token: 0x040000B5 RID: 181
|
||||||
|
Address,
|
||||||
|
// Token: 0x040000B6 RID: 182
|
||||||
|
ThisAdjust,
|
||||||
|
// Token: 0x040000B7 RID: 183
|
||||||
|
UdtKind,
|
||||||
|
// Token: 0x040000B8 RID: 184
|
||||||
|
IsEquivalentTo,
|
||||||
|
// Token: 0x040000B9 RID: 185
|
||||||
|
CallingConvention,
|
||||||
|
// Token: 0x040000BA RID: 186
|
||||||
|
IsCloseEquivalentTo,
|
||||||
|
// Token: 0x040000BB RID: 187
|
||||||
|
GTIEX_REQS_VALID,
|
||||||
|
// Token: 0x040000BC RID: 188
|
||||||
|
VirtualBaseOffset,
|
||||||
|
// Token: 0x040000BD RID: 189
|
||||||
|
VirtualBaseDispIndex,
|
||||||
|
// Token: 0x040000BE RID: 190
|
||||||
|
IsReference,
|
||||||
|
// Token: 0x040000BF RID: 191
|
||||||
|
IndirectVirtualBaseClass
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
|
19
PdbServer/PdbPaeser/UdtKind.cs
Normal file
19
PdbServer/PdbPaeser/UdtKind.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000013 RID: 19
|
||||||
|
public enum UdtKind
|
||||||
|
{
|
||||||
|
// Token: 0x0400006D RID: 109
|
||||||
|
Struct,
|
||||||
|
// Token: 0x0400006E RID: 110
|
||||||
|
Class,
|
||||||
|
// Token: 0x0400006F RID: 111
|
||||||
|
Union,
|
||||||
|
// Token: 0x04000070 RID: 112
|
||||||
|
Interface,
|
||||||
|
// Token: 0x04000071 RID: 113
|
||||||
|
Unknown = 99
|
||||||
|
}
|
||||||
|
}
|
40
PdbServer/PdbPaeser/Variant.cs
Normal file
40
PdbServer/PdbPaeser/Variant.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000017 RID: 23
|
||||||
|
[StructLayout(LayoutKind.Explicit, Size = 16)]
|
||||||
|
public struct Variant
|
||||||
|
{
|
||||||
|
// Token: 0x06000050 RID: 80 RVA: 0x00002A56 File Offset: 0x00000C56
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Format("VT: {0} iValue: {1}", this.vt, this.iValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Token: 0x040000C3 RID: 195
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public short vt;
|
||||||
|
|
||||||
|
// Token: 0x040000C4 RID: 196
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public double dValue;
|
||||||
|
|
||||||
|
// Token: 0x040000C5 RID: 197
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public int iValue;
|
||||||
|
|
||||||
|
// Token: 0x040000C6 RID: 198
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public long lValue;
|
||||||
|
|
||||||
|
// Token: 0x040000C7 RID: 199
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public byte bValue;
|
||||||
|
|
||||||
|
// Token: 0x040000C8 RID: 200
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public short sValue;
|
||||||
|
}
|
||||||
|
}
|
107
PdbServer/PdbPaeser/Win32.cs
Normal file
107
PdbServer/PdbPaeser/Win32.cs
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security;
|
||||||
|
|
||||||
|
namespace Zodiacon.DebugHelp
|
||||||
|
{
|
||||||
|
// Token: 0x02000018 RID: 24
|
||||||
|
[SuppressUnmanagedCodeSecurity]
|
||||||
|
internal static class Win32
|
||||||
|
{
|
||||||
|
// Token: 0x06000051 RID: 81
|
||||||
|
[DllImport("kernel32", SetLastError = true)]
|
||||||
|
public static extern bool CloseHandle(IntPtr handle);
|
||||||
|
|
||||||
|
// Token: 0x06000052 RID: 82
|
||||||
|
[DllImport("kernel32", SetLastError = true)]
|
||||||
|
public static extern IntPtr OpenProcess(ProcessAccessMask access, bool inheritHandle, int pid);
|
||||||
|
|
||||||
|
// Token: 0x06000053 RID: 83
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern SymbolOptions SymSetOptions(SymbolOptions options);
|
||||||
|
|
||||||
|
// Token: 0x06000054 RID: 84
|
||||||
|
[DllImport("dbghelp", CharSet = CharSet.Unicode, EntryPoint = "SymInitializeW", ExactSpelling = true, SetLastError = true)]
|
||||||
|
public static extern bool SymInitialize(IntPtr hProcess, string searchPath, bool invadeProcess);
|
||||||
|
|
||||||
|
// Token: 0x06000055 RID: 85
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymCleanup(IntPtr hProcess);
|
||||||
|
|
||||||
|
// Token: 0x06000056 RID: 86
|
||||||
|
[DllImport("dbghelp", CharSet = CharSet.Unicode, EntryPoint = "SymLoadModuleExW", ExactSpelling = true, SetLastError = true)]
|
||||||
|
public static extern ulong SymLoadModuleEx(IntPtr hProcess, IntPtr hFile, string imageName, string moduleName, ulong baseOfDll, uint dllSize, IntPtr data, uint flags);
|
||||||
|
|
||||||
|
// Token: 0x06000057 RID: 87
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymFromAddr(IntPtr hProcess, ulong address, out ulong displacement, ref SymbolInfo symbol);
|
||||||
|
|
||||||
|
// Token: 0x06000058 RID: 88
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymEnumerateModules64(IntPtr hProcess, SymEnumerateModuleProc proc, IntPtr context);
|
||||||
|
|
||||||
|
// Token: 0x06000059 RID: 89
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymRefreshModuleList(IntPtr hProcess);
|
||||||
|
|
||||||
|
// Token: 0x0600005A RID: 90
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymFromName(IntPtr hProcess, string name, ref SymbolInfo symbol);
|
||||||
|
|
||||||
|
// Token: 0x0600005B RID: 91
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymEnumSymbols(IntPtr hProcess, ulong baseOfDll, string mask, Win32.EnumSymbolCallback callback, IntPtr context);
|
||||||
|
|
||||||
|
// Token: 0x0600005C RID: 92
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymEnumTypes(IntPtr hProcess, ulong baseOfDll, Win32.EnumSymbolCallback callback, IntPtr context);
|
||||||
|
|
||||||
|
// Token: 0x0600005D RID: 93
|
||||||
|
[DllImport("dbghelp", CharSet = CharSet.Unicode, SetLastError = true)]
|
||||||
|
public static extern bool SymEnumSourceFiles(IntPtr hProcess, ulong baseOfDll, string mask, EnumSourceFilesCallback callback, IntPtr context);
|
||||||
|
|
||||||
|
// Token: 0x0600005E RID: 94
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymEnumTypesByName(IntPtr hProcess, ulong baseOfDll, string mask, Win32.EnumSymbolCallback callback, IntPtr context);
|
||||||
|
|
||||||
|
// Token: 0x0600005F RID: 95
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out int value);
|
||||||
|
|
||||||
|
// Token: 0x06000060 RID: 96
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out SymbolTag tag);
|
||||||
|
|
||||||
|
// Token: 0x06000061 RID: 97
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out UdtKind tag);
|
||||||
|
|
||||||
|
// Token: 0x06000062 RID: 98
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out Variant value);
|
||||||
|
|
||||||
|
// Token: 0x06000063 RID: 99
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public unsafe static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out char* value);
|
||||||
|
|
||||||
|
// Token: 0x06000064 RID: 100
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, out ulong value);
|
||||||
|
|
||||||
|
// Token: 0x06000065 RID: 101
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeInfo(IntPtr hProcess, ulong baseOfDll, int typeId, SymbolTypeInfo typeinfo, ref FindChildrenParams value);
|
||||||
|
|
||||||
|
// Token: 0x06000066 RID: 102
|
||||||
|
[DllImport("dbghelp", SetLastError = true)]
|
||||||
|
public static extern bool SymFromIndex(IntPtr hProcess, ulong dllBase, int index, ref SymbolInfo symbol);
|
||||||
|
|
||||||
|
// Token: 0x06000067 RID: 103
|
||||||
|
[DllImport("dbghelp", CharSet = CharSet.Unicode, SetLastError = true)]
|
||||||
|
public static extern bool SymGetTypeFromName(IntPtr hProcess, ulong dllBase, string name, ref SymbolInfo symbol);
|
||||||
|
|
||||||
|
// Token: 0x0200001E RID: 30
|
||||||
|
// (Invoke) Token: 0x06000073 RID: 115
|
||||||
|
public delegate bool EnumSymbolCallback(ref SymbolInfo symbol, uint symbolSize, IntPtr context);
|
||||||
|
}
|
||||||
|
}
|
16
PdbServer/PdbServer.csproj
Normal file
16
PdbServer/PdbServer.csproj
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.2" />
|
||||||
|
<PackageReference Include="SharpPdb" Version="1.0.4" />
|
||||||
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
70
PdbServer/Program.cs
Normal file
70
PdbServer/Program.cs
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
using System.Net;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
|
||||||
|
builder.Services.AddControllers();
|
||||||
|
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||||
|
builder.Services.AddEndpointsApiExplorer();
|
||||||
|
builder.Services.AddSwaggerGen();
|
||||||
|
|
||||||
|
var app = builder.Build();
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.UseSwagger();
|
||||||
|
app.UseSwaggerUI();
|
||||||
|
}
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
app.MapControllers();
|
||||||
|
|
||||||
|
|
||||||
|
const string selfdocpath = "D:\\Web";
|
||||||
|
app.MapGet("/",(HttpContext context) =>
|
||||||
|
{
|
||||||
|
byte[] data = File.ReadAllBytes("D:\\Web\\main.html");
|
||||||
|
context.Response.Body.WriteAsync(data, 0, data.Length);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.Run();
|
||||||
|
/*
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style type="text/css" >
|
||||||
|
#master
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
left:50%;
|
||||||
|
bottom:0;
|
||||||
|
text-align :center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<head>
|
||||||
|
<meta charset=\"utf-8\">
|
||||||
|
<title>PDB缓存服务器</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>PDB服务</h1>
|
||||||
|
<p>这是一个与微软官方pdb服务器同步的符号文件缓存服务器</p>
|
||||||
|
<p>你可以在大陆使用这个,它拥有更快的访问速度,与更低的连接延迟</p>
|
||||||
|
<p>下面是提供服务的地址,你可以将它加入到你的环境变量(_NT_SYMBOL_PATH)</p>
|
||||||
|
<p>http://www.sym101.com/download/symbols</p>
|
||||||
|
</body>
|
||||||
|
<div id="master" >
|
||||||
|
<footer><a href= "https://beian.miit.gov.cn/" target="_blank">宁ICP备2022000729号</a></footer>
|
||||||
|
</div>
|
||||||
|
</html>
|
||||||
|
*/
|
31
PdbServer/Properties/launchSettings.json
Normal file
31
PdbServer/Properties/launchSettings.json
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:1282",
|
||||||
|
"sslPort": 44300
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"PdbServer": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"applicationUrl": "https://localhost:7001;http://localhost:5001",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"launchUrl": "swagger",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
8
PdbServer/appsettings.Development.json
Normal file
8
PdbServer/appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
PdbServer/appsettings.json
Normal file
9
PdbServer/appsettings.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
14
PdbServer/index.html
Normal file
14
PdbServer/index.html
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>PDB缓存服务器</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>PDB服务</h1>
|
||||||
|
<p>这是一个与微软官方pdb服务器同步的符号文件缓存服务器</p>
|
||||||
|
<p>你可以在大陆使用这个,它拥有更快的访问速度,与更低的连接延迟</p>
|
||||||
|
<p>下面是提供服务的地址,你可以将它加入到你的环境变量(_NT_SYMBOL_PATH)</p>
|
||||||
|
<p>http://www.sym101.com/download/symbols</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
175
UpLoader/HTTP/CHttpHeader.cpp
Normal file
175
UpLoader/HTTP/CHttpHeader.cpp
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#include "CHttpHeader.h"
|
||||||
|
CHttpHeader::CHttpHeader()
|
||||||
|
: http_code_(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CHttpHeader::CHttpHeader(const char* pHeader)
|
||||||
|
: http_code_(0)
|
||||||
|
{
|
||||||
|
Revolse(std::string(pHeader));
|
||||||
|
}
|
||||||
|
|
||||||
|
CHttpHeader::CHttpHeader(const std::string& strHeader)
|
||||||
|
: http_code_(0)
|
||||||
|
{
|
||||||
|
Revolse(strHeader);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHttpHeader::CHttpHeader(CHttpHeader&& rhs)
|
||||||
|
{
|
||||||
|
this->http_code_ = rhs.http_code_;
|
||||||
|
this->http_version_ = std::move(rhs.http_version_);
|
||||||
|
this->http_response_ = std::move(rhs.http_response_);
|
||||||
|
this->request_page_ = std::move(rhs.request_page_);
|
||||||
|
this->http_headers = std::move(rhs.http_headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHttpHeader::~CHttpHeader(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CHttpHeader::GetValue(const std::string& strKey)
|
||||||
|
{
|
||||||
|
std::string strResult;
|
||||||
|
std::map<std::string, std::string>::const_iterator itor;
|
||||||
|
itor = http_headers.find(strKey);
|
||||||
|
if (itor != http_headers.end())
|
||||||
|
strResult = itor->second;
|
||||||
|
return strResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHttpHeader::addHeader(const std::string& key, const std::string& value)
|
||||||
|
{
|
||||||
|
if (key.empty() || value.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
http_headers.insert(std::make_pair(key, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHttpHeader::setUserAgent(const std::string& userAgent)
|
||||||
|
{
|
||||||
|
if (userAgent.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
http_headers.insert(std::make_pair(HEADER_USER_AGENT, userAgent));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHttpHeader::setHost(const std::string& host)
|
||||||
|
{
|
||||||
|
if (host.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
http_headers.insert(std::make_pair(HEADER_HOST, host));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHttpHeader::setRange(__int64 range)
|
||||||
|
{
|
||||||
|
if (range < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char buffer[64] = { 0 };
|
||||||
|
sprintf_s(buffer, "bytes=%i64d-", range);
|
||||||
|
http_headers.insert(std::make_pair(HEADER_RANGE, std::string(buffer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CHttpHeader::toString(HttpRequestType type)
|
||||||
|
{
|
||||||
|
//Ìî³äĬÈÏÖµ
|
||||||
|
if (http_version_.empty()) {
|
||||||
|
http_version_.assign(default_http_version);
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_USER_AGENT) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_USER_AGENT, default_user_agent));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_CONNECTION) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_USER_AGENT, default_http_version));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_ACCEPT) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_ACCEPT, default_accept));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_CONNECTION) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_CONNECTION, default_connection));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_ACCEPT_LANGUAGE) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_ACCEPT_LANGUAGE, default_language));
|
||||||
|
}
|
||||||
|
std::string header((type == HttpPost) ? "POST " : "GET ");
|
||||||
|
header += request_page_;
|
||||||
|
header.append(" ");
|
||||||
|
header += http_version_;
|
||||||
|
header.append(http_newline);
|
||||||
|
for (auto itor = http_headers.begin(); itor != http_headers.end(); ++itor) {
|
||||||
|
header += itor->first;
|
||||||
|
header.append(": ");
|
||||||
|
header += itor->second;
|
||||||
|
header.append(http_newline);
|
||||||
|
}
|
||||||
|
header.append(http_newline);
|
||||||
|
header.append(http_newline);
|
||||||
|
return std::move(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CHttpHeader::toHttpHeaders()
|
||||||
|
{
|
||||||
|
if (http_headers.find(HEADER_USER_AGENT) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_USER_AGENT, default_user_agent));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_CONNECTION) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_USER_AGENT, default_http_version));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_ACCEPT) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_ACCEPT, default_accept));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_CONNECTION) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_CONNECTION, default_connection));
|
||||||
|
}
|
||||||
|
if (http_headers.find(HEADER_ACCEPT_LANGUAGE) == http_headers.end()) {
|
||||||
|
http_headers.insert(std::make_pair(HEADER_ACCEPT_LANGUAGE, default_language));
|
||||||
|
}
|
||||||
|
std::string header;
|
||||||
|
for (auto itor = http_headers.begin(); itor != http_headers.end(); ++itor) {
|
||||||
|
header += itor->first;
|
||||||
|
header.append(": ");
|
||||||
|
header += itor->second;
|
||||||
|
header.append(http_newline);
|
||||||
|
}
|
||||||
|
return std::move(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CHttpHeader::Revolse(const std::string& strHeader)
|
||||||
|
{
|
||||||
|
int nStartPos = 0, nFindPos = 0, nLineIndex = 0;
|
||||||
|
std::string strLine, strKey, strValue;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
nFindPos = strHeader.find("\r\n", nStartPos);
|
||||||
|
if (-1 == nFindPos)
|
||||||
|
strLine = strHeader.substr(nStartPos, strHeader.size() - nStartPos);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strLine = strHeader.substr(nStartPos, nFindPos - nStartPos);
|
||||||
|
nStartPos = nFindPos + 2;
|
||||||
|
}
|
||||||
|
if (0 == nLineIndex)//µÚÒ»ÐÐ
|
||||||
|
{
|
||||||
|
http_version_ = strLine.substr(0, 8);
|
||||||
|
int nSpace1 = strLine.find(" ");
|
||||||
|
int nSpace2 = strLine.find(" ", nSpace1 + 1);
|
||||||
|
http_code_ = atoi(strLine.substr(nSpace1 + 1, nSpace2 - nSpace1 - 1).c_str());
|
||||||
|
http_response_ = strLine.substr(nSpace2 + 1, strLine.size() - nSpace2 - 1);
|
||||||
|
nLineIndex++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int nSplit = strLine.find(": ");
|
||||||
|
strKey = strLine.substr(0, nSplit);
|
||||||
|
strValue = strLine.substr(nSplit + 2, strLine.size() - nSplit - 2);
|
||||||
|
std::pair<std::string, std::string> data;
|
||||||
|
data.first = strKey;
|
||||||
|
data.second = strValue;
|
||||||
|
http_headers.insert(std::move(data));
|
||||||
|
nLineIndex++;
|
||||||
|
} while (nFindPos != -1);
|
||||||
|
return true;
|
||||||
|
}
|
50
UpLoader/HTTP/CHttpHeader.h
Normal file
50
UpLoader/HTTP/CHttpHeader.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <winhttp.h>
|
||||||
|
#include "http_defines.h"
|
||||||
|
using namespace std;
|
||||||
|
class CHttpHeader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CHttpHeader();
|
||||||
|
CHttpHeader(const char* pHeader);
|
||||||
|
CHttpHeader(const std::string& strHeader);
|
||||||
|
CHttpHeader(CHttpHeader&& rhs);
|
||||||
|
virtual ~CHttpHeader(void);
|
||||||
|
|
||||||
|
|
||||||
|
const std::string& getHttpVersion()const { return http_version_; }
|
||||||
|
void setHttpVersion(const std::string& version) { http_version_ = version; }
|
||||||
|
void setRequestPath(const std::string& path) { request_page_ = path; }
|
||||||
|
|
||||||
|
const int GetHttpCode()const { return http_code_; }
|
||||||
|
|
||||||
|
const char* GetContent()const { return http_response_.c_str(); }
|
||||||
|
|
||||||
|
std::string GetValue(const std::string& strKey);
|
||||||
|
|
||||||
|
void addHeader(const std::string& key, const std::string& value);
|
||||||
|
void setUserAgent(const std::string& userAgent);
|
||||||
|
void setHost(const std::string& host);
|
||||||
|
void setRange(__int64 range);
|
||||||
|
|
||||||
|
//转成http请求头
|
||||||
|
std::string toString(HttpRequestType type);
|
||||||
|
//转成http请求头列表
|
||||||
|
std::string toHttpHeaders();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//解析HTTP头结构
|
||||||
|
bool Revolse(const std::string& strHeader);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int http_code_;
|
||||||
|
std::string http_version_;
|
||||||
|
std::string http_response_;
|
||||||
|
std::string request_page_;
|
||||||
|
std::map<std::string, std::string> http_headers;
|
||||||
|
};
|
401
UpLoader/HTTP/HttpClient.cpp
Normal file
401
UpLoader/HTTP/HttpClient.cpp
Normal file
@ -0,0 +1,401 @@
|
|||||||
|
#include "HttpClient.h"
|
||||||
|
#include "http_common.h"
|
||||||
|
inline void CloseInternetHandle(HINTERNET* hInternet)
|
||||||
|
{
|
||||||
|
if (*hInternet)
|
||||||
|
{
|
||||||
|
WinHttpCloseHandle(*hInternet);
|
||||||
|
*hInternet = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HttpClient::HttpClient(void)
|
||||||
|
: m_hInternet(NULL)
|
||||||
|
, m_hConnect(NULL)
|
||||||
|
, m_hRequest(NULL)
|
||||||
|
, m_nConnTimeout(500000)
|
||||||
|
, m_nSendTimeout(500000)
|
||||||
|
, m_nRecvTimeout(500000)
|
||||||
|
, m_bHttps(false)
|
||||||
|
, m_nResponseCode(0)
|
||||||
|
{
|
||||||
|
memset(&m_paramsData, 0, sizeof(HttpParamsData));
|
||||||
|
Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpClient::~HttpClient(void)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::Init()
|
||||||
|
{
|
||||||
|
m_hInternet = ::WinHttpOpen(
|
||||||
|
L"Microsoft Internet Explorer",
|
||||||
|
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
|
||||||
|
WINHTTP_NO_PROXY_NAME,
|
||||||
|
WINHTTP_NO_PROXY_BYPASS,
|
||||||
|
0);
|
||||||
|
if (NULL == m_hInternet)
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorInit;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
::WinHttpSetTimeouts(m_hInternet, 0, m_nConnTimeout, m_nSendTimeout, m_nRecvTimeout);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpClient::Release()
|
||||||
|
{
|
||||||
|
CloseInternetHandle(&m_hRequest);
|
||||||
|
CloseInternetHandle(&m_hConnect);
|
||||||
|
CloseInternetHandle(&m_hInternet);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::ConnectHttpServer(LPCWSTR lpIP, WORD wPort)
|
||||||
|
{
|
||||||
|
m_hConnect = ::WinHttpConnect(m_hInternet, lpIP, wPort, 0);
|
||||||
|
return m_hConnect != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::CreateHttpRequest(LPCWSTR lpPage, HttpRequestType type, DWORD dwFlag/*=0*/)
|
||||||
|
{
|
||||||
|
const wchar_t* pVerb = (type == HttpGet) ? L"GET" : L"POST";
|
||||||
|
m_hRequest = ::WinHttpOpenRequest(
|
||||||
|
m_hConnect,
|
||||||
|
pVerb,
|
||||||
|
lpPage,
|
||||||
|
NULL,
|
||||||
|
WINHTTP_NO_REFERER,
|
||||||
|
WINHTTP_DEFAULT_ACCEPT_TYPES,
|
||||||
|
dwFlag);
|
||||||
|
return m_hRequest != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpClient::SetTimeOut(int dwConnectTime, int dwSendTime, int dwRecvTime)
|
||||||
|
{
|
||||||
|
m_nConnTimeout = dwConnectTime;
|
||||||
|
m_nSendTimeout = dwSendTime;
|
||||||
|
m_nRecvTimeout = dwRecvTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::DownloadFile(LPCWSTR lpUrl, LPCWSTR lpFilePath)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
if (!Init())
|
||||||
|
return false;
|
||||||
|
bool bRet = false;
|
||||||
|
DWORD dwBytesToRead = 0, dwFileSize = 0, dwReadSize = 0, dwRecvSize = 0;
|
||||||
|
if (!InitConnect(lpUrl, HttpGet))
|
||||||
|
return false;
|
||||||
|
if (!QueryContentLength(dwFileSize))
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorQuery;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_nResponseCode = QueryStatusCode();
|
||||||
|
if (m_nResponseCode == HTTP_STATUS_NOT_FOUND) {
|
||||||
|
m_paramsData.errcode = HttpError404;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
HANDLE hFile = CreateFile(lpFilePath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (INVALID_HANDLE_VALUE == hFile)
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorCreateFile;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
SetFilePointer(hFile, dwFileSize, 0, FILE_BEGIN);
|
||||||
|
SetEndOfFile(hFile);
|
||||||
|
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
{
|
||||||
|
CloseHandle(hFile);
|
||||||
|
DeleteFile(lpFilePath);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void* lpBuff = malloc(READ_BUFFER_SIZE);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (dwBytesToRead > READ_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
free(lpBuff);
|
||||||
|
lpBuff = malloc(dwBytesToRead);
|
||||||
|
}
|
||||||
|
if (!::WinHttpReadData(m_hRequest, lpBuff, dwBytesToRead, &dwReadSize))
|
||||||
|
break;
|
||||||
|
DWORD dwWriteByte;
|
||||||
|
if (!WriteFile(hFile, lpBuff, dwReadSize, &dwWriteByte, NULL) || (dwReadSize != dwWriteByte))
|
||||||
|
break;
|
||||||
|
dwRecvSize += dwReadSize;
|
||||||
|
if (m_paramsData.callback)
|
||||||
|
m_paramsData.callback->OnDownloadCallback(m_paramsData.lpparam, HttpLoading, dwFileSize, dwRecvSize);
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
break;
|
||||||
|
if (dwBytesToRead <= 0)
|
||||||
|
{
|
||||||
|
bRet = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(lpBuff);
|
||||||
|
CloseHandle(hFile);
|
||||||
|
if (!bRet)
|
||||||
|
{//下载失败,删除文件
|
||||||
|
DeleteFile(lpFilePath);
|
||||||
|
}
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::DownloadToMem(LPCWSTR lpUrl, OUT void** ppBuffer, OUT int* nSize)
|
||||||
|
{
|
||||||
|
bool bResult = false;
|
||||||
|
BYTE* lpFileMem = NULL;
|
||||||
|
void* lpBuff = NULL;
|
||||||
|
DWORD dwLength = 0, dwBytesToRead = 0, dwReadSize = 0, dwRecvSize = 0;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!InitConnect(lpUrl, HttpGet))
|
||||||
|
throw HttpErrorInit;
|
||||||
|
if (!QueryContentLength(dwLength))
|
||||||
|
throw HttpErrorQuery;
|
||||||
|
m_nResponseCode = QueryStatusCode();
|
||||||
|
if (m_nResponseCode == HTTP_STATUS_NOT_FOUND) {
|
||||||
|
throw HttpError404;
|
||||||
|
}
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
throw HttpErrorQuery;
|
||||||
|
if (dwLength > DOWNLOAD_BUFFER_SIZE)
|
||||||
|
throw HttpErrorBuffer;//文件大小超过预设最大值,不建议下载到内存
|
||||||
|
lpFileMem = (BYTE*)malloc(dwLength);
|
||||||
|
lpBuff = malloc(READ_BUFFER_SIZE);
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (dwBytesToRead > READ_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
free(lpBuff);
|
||||||
|
lpBuff = malloc(dwBytesToRead);
|
||||||
|
}
|
||||||
|
if (!::WinHttpReadData(m_hRequest, lpBuff, dwBytesToRead, &dwReadSize))
|
||||||
|
throw HttpErrorDownload;
|
||||||
|
memcpy(lpFileMem + dwRecvSize, lpBuff, dwReadSize);
|
||||||
|
dwRecvSize += dwReadSize;
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
throw HttpErrorDownload;
|
||||||
|
if (dwBytesToRead <= 0)
|
||||||
|
{
|
||||||
|
bResult = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (HttpInterfaceError error)
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = error;
|
||||||
|
}
|
||||||
|
if (lpBuff)
|
||||||
|
free(lpBuff);
|
||||||
|
if (bResult)
|
||||||
|
{
|
||||||
|
*ppBuffer = lpFileMem;
|
||||||
|
*nSize = dwRecvSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
free(lpFileMem);
|
||||||
|
return bResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpClient::SetDownloadCallback(IHttpCallback* pCallback, void* pParam)
|
||||||
|
{
|
||||||
|
m_paramsData.callback = pCallback;
|
||||||
|
m_paramsData.lpparam = pParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpClient::AddHeader(LPCSTR key, LPCSTR value)
|
||||||
|
{
|
||||||
|
if (isEmptyString(key) || isEmptyString(value)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_header.addHeader(string(key), string(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
string HttpClient::Request(LPCSTR lpUrl, HttpRequestType type, void* lpPostData /*= NULL*/, LPCSTR lpHeader/*=NULL*/)
|
||||||
|
{
|
||||||
|
string strRet;
|
||||||
|
wstring strUrl = A2U(string(lpUrl));
|
||||||
|
if (!InitConnect(strUrl.c_str(), type, lpPostData, 0, (lpHeader == NULL) ? NULL : A2U(string(lpHeader)).c_str()))
|
||||||
|
return strRet;
|
||||||
|
m_nResponseCode = QueryStatusCode();
|
||||||
|
if (m_nResponseCode == HTTP_STATUS_NOT_FOUND) {
|
||||||
|
throw HttpError404;
|
||||||
|
}
|
||||||
|
DWORD dwBytesToRead, dwReadSize;
|
||||||
|
void* lpBuff = malloc(READ_BUFFER_SIZE);
|
||||||
|
bool bFinish = false;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
break;
|
||||||
|
if (dwBytesToRead <= 0)
|
||||||
|
{
|
||||||
|
bFinish = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (dwBytesToRead > READ_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
free(lpBuff);
|
||||||
|
lpBuff = malloc(dwBytesToRead);
|
||||||
|
}
|
||||||
|
if (!::WinHttpReadData(m_hRequest, lpBuff, dwBytesToRead, &dwReadSize))
|
||||||
|
break;
|
||||||
|
strRet.append((const char*)lpBuff, dwReadSize);
|
||||||
|
}
|
||||||
|
free(lpBuff);
|
||||||
|
if (!bFinish)
|
||||||
|
strRet.clear();
|
||||||
|
return strRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
string HttpClient::Request(LPCWSTR lpUrl, HttpRequestType type, void* lpPostData /*= NULL*/, int datelen, LPCWSTR lpHeader/*=NULL*/)
|
||||||
|
{
|
||||||
|
string strRet;
|
||||||
|
if (!InitConnect(lpUrl, type, lpPostData, datelen, lpHeader))
|
||||||
|
return strRet;
|
||||||
|
m_nResponseCode = QueryStatusCode();
|
||||||
|
if (m_nResponseCode == HTTP_STATUS_NOT_FOUND) {
|
||||||
|
throw HttpError404;
|
||||||
|
}
|
||||||
|
DWORD dwBytesToRead, dwReadSize;
|
||||||
|
void* lpBuff = malloc(READ_BUFFER_SIZE);
|
||||||
|
bool bFinish = false;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (!::WinHttpQueryDataAvailable(m_hRequest, &dwBytesToRead))
|
||||||
|
break;
|
||||||
|
if (dwBytesToRead <= 0)
|
||||||
|
{
|
||||||
|
bFinish = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (dwBytesToRead > READ_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
free(lpBuff);
|
||||||
|
lpBuff = malloc(dwBytesToRead);
|
||||||
|
}
|
||||||
|
if (!::WinHttpReadData(m_hRequest, lpBuff, dwBytesToRead, &dwReadSize))
|
||||||
|
break;
|
||||||
|
strRet.append((const char*)lpBuff, dwReadSize);
|
||||||
|
}
|
||||||
|
free(lpBuff);
|
||||||
|
if (!bFinish)
|
||||||
|
strRet.clear();
|
||||||
|
return strRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
string HttpClient::Get(LPCWSTR lpUrl)
|
||||||
|
{
|
||||||
|
return this->Request(lpUrl, HttpGet);
|
||||||
|
}
|
||||||
|
string HttpClient::Post(LPCWSTR lpUrl,const void* lpPostData, int datelen, LPCWSTR lpHeader)
|
||||||
|
{
|
||||||
|
return this->Request(lpUrl, HttpPost,(void*) lpPostData, datelen, lpHeader);
|
||||||
|
}
|
||||||
|
bool HttpClient::QueryRawHeaders(OUT wstring& strHeaders)
|
||||||
|
{
|
||||||
|
bool bRet = false;
|
||||||
|
DWORD dwSize;
|
||||||
|
BOOL bResult = ::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
|
||||||
|
if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
|
||||||
|
{
|
||||||
|
wchar_t* lpData = (wchar_t*)malloc(dwSize);
|
||||||
|
bResult = ::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS, WINHTTP_HEADER_NAME_BY_INDEX, lpData, &dwSize, WINHTTP_NO_HEADER_INDEX);
|
||||||
|
if (bResult)
|
||||||
|
{
|
||||||
|
strHeaders = lpData;
|
||||||
|
bRet = true;
|
||||||
|
}
|
||||||
|
free(lpData);
|
||||||
|
}
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::QueryContentLength(OUT DWORD& dwLength)
|
||||||
|
{
|
||||||
|
bool bRet = false;
|
||||||
|
wchar_t szBuffer[24] = { 0 };
|
||||||
|
DWORD dwSize = 24 * sizeof(wchar_t);
|
||||||
|
if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_CONTENT_LENGTH, WINHTTP_HEADER_NAME_BY_INDEX, szBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX))
|
||||||
|
{
|
||||||
|
TCHAR* p = NULL;
|
||||||
|
dwLength = wcstoul(szBuffer, &p, 10);
|
||||||
|
bRet = true;
|
||||||
|
}
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
int HttpClient::QueryStatusCode()
|
||||||
|
{
|
||||||
|
int http_code = 0;
|
||||||
|
wchar_t szBuffer[24] = { 0 };
|
||||||
|
DWORD dwSize = 24 * sizeof(wchar_t);
|
||||||
|
if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_STATUS_CODE, WINHTTP_HEADER_NAME_BY_INDEX, szBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX)) {
|
||||||
|
wchar_t* p = NULL;
|
||||||
|
http_code = wcstoul(szBuffer, &p, 10);
|
||||||
|
}
|
||||||
|
return http_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::InitConnect(LPCWSTR lpUrl, HttpRequestType type, void* lpPostData/*=NULL*/, int datelen, LPCWSTR lpHeader/*=NULL*/)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
if (!Init())
|
||||||
|
return false;
|
||||||
|
wstring strHostName, strPage;
|
||||||
|
WORD wPort;
|
||||||
|
MyParseUrlW(lpUrl, strHostName, strPage, wPort);
|
||||||
|
if (wPort == INTERNET_DEFAULT_HTTPS_PORT)
|
||||||
|
m_bHttps = true;
|
||||||
|
if (!ConnectHttpServer(strHostName.c_str(), wPort))
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorConnect;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DWORD dwFlag = m_bHttps ? WINHTTP_FLAG_SECURE : 0;
|
||||||
|
if (!CreateHttpRequest(strPage.c_str(), type, dwFlag))
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorInit;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_bHttps)
|
||||||
|
{
|
||||||
|
DWORD dwFlags = SECURITY_FLAG_SECURE |
|
||||||
|
SECURITY_FLAG_IGNORE_UNKNOWN_CA |
|
||||||
|
SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE |
|
||||||
|
SECURITY_FLAG_IGNORE_CERT_CN_INVALID |
|
||||||
|
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
|
||||||
|
WinHttpSetOption(m_hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
|
||||||
|
}
|
||||||
|
if (!SendHttpRequest(lpPostData, datelen, lpHeader))
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorSend;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!WinHttpReceiveResponse(m_hRequest, NULL))
|
||||||
|
{
|
||||||
|
m_paramsData.errcode = HttpErrorInit;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpClient::SendHttpRequest(void* lpPostData/*=NULL*/,int datelen, LPCWSTR lpHeader/*=NULL*/)
|
||||||
|
{
|
||||||
|
//添加HTTP头
|
||||||
|
std::wstring header = A2U(m_header.toHttpHeaders());
|
||||||
|
::WinHttpAddRequestHeaders(m_hRequest, header.c_str(), header.size(), WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);
|
||||||
|
if (lpHeader == NULL)
|
||||||
|
return ::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, lpPostData, datelen, datelen, NULL) == TRUE;
|
||||||
|
else
|
||||||
|
return ::WinHttpSendRequest(m_hRequest, lpHeader, -1L, lpPostData, datelen, datelen, NULL) == TRUE;
|
||||||
|
}
|
||||||
|
|
51
UpLoader/HTTP/HttpClient.h
Normal file
51
UpLoader/HTTP/HttpClient.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CHttpHeader.h"
|
||||||
|
using namespace std;
|
||||||
|
#define CONTENTTYPE_JSON L"Content-Type: application/json;"
|
||||||
|
#define CONTENTTYPE_TEXT L"Content-Type: text/html;"
|
||||||
|
#define CONTENTTYPE_URLENCODED L"Content-Type: application/x-www-form-urlencoded;charset:utf-8;"
|
||||||
|
class HttpClient
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HttpClient(void);
|
||||||
|
~HttpClient(void);
|
||||||
|
|
||||||
|
void SetTimeOut(int dwConnectTime, int dwSendTime, int dwRecvTime);
|
||||||
|
string Request(LPCSTR lpUrl, HttpRequestType type, void* lpPostData = NULL, LPCSTR lpHeader = NULL);
|
||||||
|
string Request(LPCWSTR lpUrl, HttpRequestType type, void* lpPostData = NULL, int datelen = 0, LPCWSTR lpHeader = NULL);
|
||||||
|
string Get(LPCWSTR lpUrl);
|
||||||
|
string Post(LPCWSTR lpUrl,const void* lpPostData = NULL, int datelen = 0, LPCWSTR lpHeader = NULL);
|
||||||
|
void FreeInstance() { delete this; }
|
||||||
|
bool DownloadFile(LPCWSTR lpUrl, LPCWSTR lpFilePath);
|
||||||
|
bool DownloadToMem(LPCWSTR lpUrl, OUT void** ppBuffer, OUT int* nSize);
|
||||||
|
void SetDownloadCallback(IHttpCallback* pCallback, void* pParam);
|
||||||
|
HttpInterfaceError GetErrorCode() { return m_paramsData.errcode; }
|
||||||
|
void AddHeader(LPCSTR key, LPCSTR value);
|
||||||
|
int GetResponseCode() { return m_nResponseCode; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool Init();
|
||||||
|
void Release();
|
||||||
|
//init
|
||||||
|
bool InitConnect(LPCWSTR lpUrl, HttpRequestType type, void* lpPostData = NULL, int datelen = 0, LPCWSTR lpHeader = NULL);
|
||||||
|
bool ConnectHttpServer(LPCWSTR lpIP, WORD wPort);
|
||||||
|
bool CreateHttpRequest(LPCWSTR lpPage, HttpRequestType type, DWORD dwFlag = 0);
|
||||||
|
bool SendHttpRequest(void* lpPostData = NULL, int datelen = 0, LPCWSTR lpHeader = NULL);
|
||||||
|
//query
|
||||||
|
bool QueryRawHeaders(OUT wstring& strHeaders);
|
||||||
|
bool QueryContentLength(OUT DWORD& dwLength);
|
||||||
|
int QueryStatusCode();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_nResponseCode;
|
||||||
|
bool m_bHttps;
|
||||||
|
HINTERNET m_hInternet;
|
||||||
|
HINTERNET m_hConnect;
|
||||||
|
HINTERNET m_hRequest;
|
||||||
|
int m_nConnTimeout;
|
||||||
|
int m_nSendTimeout;
|
||||||
|
int m_nRecvTimeout;
|
||||||
|
CHttpHeader m_header;
|
||||||
|
HttpParamsData m_paramsData;
|
||||||
|
};
|
||||||
|
|
149
UpLoader/HTTP/http_common.h
Normal file
149
UpLoader/HTTP/http_common.h
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include <string>
|
||||||
|
#include <Windows.h>
|
||||||
|
using std::wstring;
|
||||||
|
using std::string;
|
||||||
|
#pragma comment(lib,"WinHttp.lib")
|
||||||
|
|
||||||
|
|
||||||
|
inline void MyParseUrlW(LPCWSTR lpUrl, wstring& strHostName, wstring& strPage, WORD& sPort)
|
||||||
|
{
|
||||||
|
sPort = 80;
|
||||||
|
wstring strTemp(lpUrl);
|
||||||
|
int nPos = strTemp.find(L"http://");
|
||||||
|
if (wstring::npos != nPos)
|
||||||
|
strTemp = strTemp.substr(nPos + 7, strTemp.size() - nPos - 7);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nPos = strTemp.find(L"https://");
|
||||||
|
if (wstring::npos != nPos)
|
||||||
|
{
|
||||||
|
sPort = 443;//INTERNET_DEFAULT_HTTPS_PORT;
|
||||||
|
strTemp = strTemp.substr(nPos + 8, strTemp.size() - nPos - 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nPos = strTemp.find('/');
|
||||||
|
if (wstring::npos == nPos)//没有找到 /
|
||||||
|
strHostName = strTemp;
|
||||||
|
else
|
||||||
|
strHostName = strTemp.substr(0, nPos);
|
||||||
|
int nPos1 = strHostName.find(':');
|
||||||
|
if (nPos1 != wstring::npos)
|
||||||
|
{
|
||||||
|
wstring strPort = strTemp.substr(nPos1 + 1, strHostName.size() - nPos1 - 1);
|
||||||
|
strHostName = strHostName.substr(0, nPos1);
|
||||||
|
sPort = (WORD)_wtoi(strPort.c_str());
|
||||||
|
}
|
||||||
|
if (wstring::npos == nPos) {
|
||||||
|
strPage = '/';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strPage = strTemp.substr(nPos, strTemp.size() - nPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void MyParseUrlA(LPCSTR lpUrl, string& strHostName, string& strPage, WORD& sPort)
|
||||||
|
{
|
||||||
|
sPort = 80;
|
||||||
|
string strTemp(lpUrl);
|
||||||
|
int nPos = strTemp.find("http://");
|
||||||
|
if (string::npos != nPos)
|
||||||
|
strTemp = strTemp.substr(nPos + 7, strTemp.size() - nPos - 7);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nPos = strTemp.find("https://");
|
||||||
|
if (wstring::npos != nPos)
|
||||||
|
{
|
||||||
|
sPort = 443;//INTERNET_DEFAULT_HTTPS_PORT;
|
||||||
|
strTemp = strTemp.substr(nPos + 8, strTemp.size() - nPos - 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nPos = strTemp.find('/');
|
||||||
|
if (string::npos == nPos)//没有找到 /
|
||||||
|
strHostName = strTemp;
|
||||||
|
else
|
||||||
|
strHostName = strTemp.substr(0, nPos);
|
||||||
|
int nPos1 = strHostName.find(':');
|
||||||
|
if (nPos1 != string::npos)
|
||||||
|
{
|
||||||
|
string strPort = strTemp.substr(nPos1 + 1, strHostName.size() - nPos1 - 1);
|
||||||
|
strHostName = strHostName.substr(0, nPos1);
|
||||||
|
sPort = (WORD)atoi(strPort.c_str());
|
||||||
|
}
|
||||||
|
if (string::npos == nPos) {
|
||||||
|
strPage = '/';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strPage = strTemp.substr(nPos, strTemp.size() - nPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline wstring Utf2U(const string& strUtf8)
|
||||||
|
{
|
||||||
|
wstring wstrRet(L"");
|
||||||
|
int nLen = MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, NULL, 0);
|
||||||
|
if (nLen == ERROR_NO_UNICODE_TRANSLATION)
|
||||||
|
throw "Utf8ToUnicode出错:无效的UTF-8字符串。";
|
||||||
|
wstrRet.resize(nLen + 1, '\0');
|
||||||
|
MultiByteToWideChar(CP_UTF8, 0, strUtf8.c_str(), -1, (LPWSTR)wstrRet.c_str(), nLen);
|
||||||
|
return wstrRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline string U2A(const wstring& str)
|
||||||
|
{
|
||||||
|
string strDes = "";
|
||||||
|
if (str.empty())
|
||||||
|
return "";
|
||||||
|
int nLen = ::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL);
|
||||||
|
if (0 == nLen)
|
||||||
|
return "";
|
||||||
|
char* pBuffer = new char[nLen + 1];
|
||||||
|
memset(pBuffer, 0, nLen + 1);
|
||||||
|
::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), pBuffer, nLen, NULL, NULL);
|
||||||
|
pBuffer[nLen] = '\0';
|
||||||
|
strDes.append(pBuffer);
|
||||||
|
delete[] pBuffer;
|
||||||
|
return strDes;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline wstring A2U(const string& str)
|
||||||
|
{
|
||||||
|
wstring strDes;
|
||||||
|
if (str.empty())
|
||||||
|
return L"";
|
||||||
|
int nLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
|
||||||
|
if (0 == nLen)
|
||||||
|
return L"";
|
||||||
|
wchar_t* pBuffer = new wchar_t[nLen + 1];
|
||||||
|
memset(pBuffer, 0, nLen + 1);
|
||||||
|
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), pBuffer, nLen);
|
||||||
|
pBuffer[nLen] = '\0';
|
||||||
|
strDes.append(pBuffer);
|
||||||
|
delete[] pBuffer;
|
||||||
|
return strDes;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool FileExistA(LPCSTR lpFile)
|
||||||
|
{
|
||||||
|
HANDLE hFile = CreateFileA(lpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
|
return false;
|
||||||
|
CloseHandle(hFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool FileExistW(LPCWSTR lpFile)
|
||||||
|
{
|
||||||
|
HANDLE hFile = CreateFileW(lpFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
|
return false;
|
||||||
|
CloseHandle(hFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool isEmptyString(LPCSTR lpStr)
|
||||||
|
{
|
||||||
|
if (NULL == lpStr || strlen(lpStr) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
93
UpLoader/HTTP/http_defines.h
Normal file
93
UpLoader/HTTP/http_defines.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
enum HttpRequestType
|
||||||
|
{
|
||||||
|
HttpGet = 0,
|
||||||
|
HttpPost,
|
||||||
|
};
|
||||||
|
//枚举下载状态
|
||||||
|
enum DownloadState
|
||||||
|
{
|
||||||
|
HttpLoading = 0,
|
||||||
|
HttpFialed,
|
||||||
|
HttpFinished,
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************
|
||||||
|
*定义错误信息
|
||||||
|
*
|
||||||
|
******************************************************/
|
||||||
|
enum HttpInterfaceError
|
||||||
|
{
|
||||||
|
HttpErrorSuccess = 0, //成功
|
||||||
|
HttpErrorInit, //初始化失败
|
||||||
|
HttpErrorConnect, //连接HTTP服务器失败
|
||||||
|
HttpErrorSend, //发送请求失败
|
||||||
|
HttpErrorQuery, //查询HTTP请求头失败
|
||||||
|
HttpError404, //页面不存在
|
||||||
|
HttpErrorIllegalUrl, //无效的URL
|
||||||
|
HttpErrorCreateFile, //创建文件失败
|
||||||
|
HttpErrorDownload, //下载失败
|
||||||
|
HttpErrorQueryIP, //获取域名对应的地址失败
|
||||||
|
HttpErrorSocket, //套接字错误
|
||||||
|
HttpErrorUserCancel, //用户取消下载
|
||||||
|
HttpErrorBuffer, //文件太大,缓冲区不足
|
||||||
|
HttpErrorHeader, //HTTP请求头错误
|
||||||
|
HttpErrorParam, //参数错误,空指针,空字符……
|
||||||
|
HttpErrorWriteFile, //写入文件失败
|
||||||
|
HttpErrorUnknow, //未知错误
|
||||||
|
|
||||||
|
};
|
||||||
|
//下载的回调
|
||||||
|
class IHttpCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void OnDownloadCallback(void* pParam, DownloadState state, double nTotalSize, double nLoadSize) = 0;
|
||||||
|
virtual bool IsNeedStop() = 0;
|
||||||
|
};
|
||||||
|
//定义每次读取数据的缓冲区大小 4KB
|
||||||
|
#define READ_BUFFER_SIZE 4096
|
||||||
|
|
||||||
|
//内存中设置的缓冲区大小 8M
|
||||||
|
#define DOWNLOAD_BUFFER_SIZE (8*1024*1024)
|
||||||
|
|
||||||
|
//回调参数信息
|
||||||
|
struct HttpParamsData
|
||||||
|
{
|
||||||
|
void* lpparam;//自定义数据
|
||||||
|
IHttpCallback* callback;//回调函数
|
||||||
|
HttpInterfaceError errcode;//错误码
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//定义常用http头名称
|
||||||
|
#define HEADER_USER_AGENT "User-Agent"
|
||||||
|
#define HEADER_CONNECTION "Connection"
|
||||||
|
#define HEADER_ACCEPT "Accept"
|
||||||
|
#define HEADER_ACCEPT_ENCODING "Accept-Encoding"
|
||||||
|
#define HEADER_ACCEPT_LANGUAGE "Accept-Language"
|
||||||
|
#define HEADER_CONTENT_TYPE "Content-Type"
|
||||||
|
#define HEADER_HOST "Host"
|
||||||
|
#define HEADER_RANGE "Range"
|
||||||
|
#define HEADER_LOCATION "Location"
|
||||||
|
#define HEADER_CONTENT_LENGTH "Content-Length"
|
||||||
|
|
||||||
|
|
||||||
|
//默认HTTP版本
|
||||||
|
static const char default_http_version[] = "HTTP/1.1";
|
||||||
|
|
||||||
|
//定义默认的userAgent
|
||||||
|
static const char default_user_agent[] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.4044.92 Safari/537.36";
|
||||||
|
|
||||||
|
//默认接收类型
|
||||||
|
static const char default_accept[] = "*/*";
|
||||||
|
|
||||||
|
//默认保持连接
|
||||||
|
static const char default_connection[] = "Keep-Alive";
|
||||||
|
|
||||||
|
//默认语言
|
||||||
|
static const char default_language[] = "zh-CN,zh;q=0.9";
|
||||||
|
|
||||||
|
//HTTP协议换行符
|
||||||
|
static const char http_newline[] = "\r\n";
|
235
UpLoader/List.h
Normal file
235
UpLoader/List.h
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <windows.h>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#ifndef PROPERTY
|
||||||
|
#define PROPERTY(t,n) __declspec( property (put = property__set_##n, get = property__get_##n)) t n
|
||||||
|
#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n
|
||||||
|
#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n
|
||||||
|
#define GET(t,n) t property__get_##n()
|
||||||
|
#define SET(t,n) void property__set_##n(const t& value)
|
||||||
|
#endif // !PROPERTY
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T, class _Alloc = allocator<T>>
|
||||||
|
class List :public vector<T, _Alloc>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
List() {}
|
||||||
|
List(T* val, int len)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
this->push_back(val[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List(initializer_list<T> val)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < val.size(); i++)
|
||||||
|
{
|
||||||
|
this->push_back(val.begin()[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List(vector< T> val)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < val.size(); i++)
|
||||||
|
{
|
||||||
|
this->push_back(val[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~List() {}
|
||||||
|
T& operator[](int index)
|
||||||
|
{
|
||||||
|
return this->data()[index];
|
||||||
|
}
|
||||||
|
PROPERTY(int, Count);
|
||||||
|
GET(int, Count)
|
||||||
|
{
|
||||||
|
return this->size();
|
||||||
|
}
|
||||||
|
SET(int, Count)
|
||||||
|
{
|
||||||
|
this->resize(value);
|
||||||
|
}
|
||||||
|
void Add(T val)
|
||||||
|
{
|
||||||
|
this->push_back(val);
|
||||||
|
}
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
this->clear();
|
||||||
|
}
|
||||||
|
void AddRange(T* val, int len)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + len);
|
||||||
|
memcpy(&this->operator[](ldx), &val[0], sizeof(T) * len);
|
||||||
|
}
|
||||||
|
void AddRange(initializer_list<T> val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val.begin()[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(List<T>& val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(List<T>* val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val->size());
|
||||||
|
memcpy(&this->data()[ldx], &val->data()[0], sizeof(T) * val->size());
|
||||||
|
}
|
||||||
|
void AddRange(vector<T>& val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val.size());
|
||||||
|
memcpy(&this->data()[ldx], &val[0], sizeof(T) * val.size());
|
||||||
|
}
|
||||||
|
void AddRange(vector<T>* val)
|
||||||
|
{
|
||||||
|
int ldx = this->Count;
|
||||||
|
this->resize(this->size() + val->size());
|
||||||
|
memcpy(&this->data()[ldx], &val->data()[0], sizeof(T) * val->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Insert(int index, T val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->push_back(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, initializer_list<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, vector<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, vector<T>* val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val->begin(), val->end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, List<T>& val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val.begin(), val.end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Insert(int index, List<T>* val)
|
||||||
|
{
|
||||||
|
if (index >= this->size())
|
||||||
|
{
|
||||||
|
this->AddRange(val);
|
||||||
|
}
|
||||||
|
else if (index >= 0)
|
||||||
|
{
|
||||||
|
this->insert(this->begin() + index, val->begin(), val->end() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RemoveAt(int index)
|
||||||
|
{
|
||||||
|
if (index >= 0 && index < this->size())
|
||||||
|
{
|
||||||
|
this->erase(this->begin() + index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int IndexOf(T& value)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < this->Count; i++)
|
||||||
|
{
|
||||||
|
if (this->at(i) == value)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool Contains(T& value)
|
||||||
|
{
|
||||||
|
return IndexOf(value) >= 0;
|
||||||
|
}
|
||||||
|
int LastIndexOf(T& value)
|
||||||
|
{
|
||||||
|
for (int i = this->Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (this->at(i) == value)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int Remove(T item)
|
||||||
|
{
|
||||||
|
int num = 0;
|
||||||
|
for (int i = this->Count; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (this->data()[i] == item)
|
||||||
|
{
|
||||||
|
RemoveAt(i);
|
||||||
|
num += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
vector<T>& GetVector()
|
||||||
|
{
|
||||||
|
return *(vector<T>*)this;
|
||||||
|
}
|
||||||
|
T* Pointer()
|
||||||
|
{
|
||||||
|
return this->data();
|
||||||
|
}
|
||||||
|
T& get(int i)
|
||||||
|
{
|
||||||
|
return this->data()[i];
|
||||||
|
}
|
||||||
|
void set(int i, T val)
|
||||||
|
{
|
||||||
|
this->data()[i] = val;
|
||||||
|
}
|
||||||
|
T& First()
|
||||||
|
{
|
||||||
|
return this->data()[0];
|
||||||
|
}
|
||||||
|
T& Last()
|
||||||
|
{
|
||||||
|
return this->data()[this->size() - 1];
|
||||||
|
}
|
||||||
|
};
|
104
UpLoader/UpLoader.cpp
Normal file
104
UpLoader/UpLoader.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#include "HTTP/HttpClient.h"
|
||||||
|
#include "helper.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "List.h"
|
||||||
|
char* FindChar(const char* str,char f)
|
||||||
|
{
|
||||||
|
int len = strlen(str);
|
||||||
|
for (char* c = (char*)str+ len; c >= str; c--)
|
||||||
|
{
|
||||||
|
if (*c == f) return c;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
int main(int argns, char** args)
|
||||||
|
{
|
||||||
|
if (argns > 1)
|
||||||
|
{
|
||||||
|
List<char> post_data = List<char>();
|
||||||
|
HttpClient* cli = new HttpClient();
|
||||||
|
for (int i = 0; i < argns - 1; i++)
|
||||||
|
{
|
||||||
|
post_data.clear();
|
||||||
|
const char* path = args[i + 1];
|
||||||
|
char* fname = FindChar(path, '\\');
|
||||||
|
if (fname)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
fname += 1;
|
||||||
|
auto data = ReadAllBytes(path);
|
||||||
|
auto tmp_postdata = ToHex(data->begin(), data->size());
|
||||||
|
post_data.Add('\"');
|
||||||
|
post_data.AddRange(tmp_postdata, data->size()*2);
|
||||||
|
post_data.Add('\"');
|
||||||
|
wchar_t tmpurl[0x1000] = {0};
|
||||||
|
memset(tmpurl, 0, 0x2000);
|
||||||
|
swprintf_s(tmpurl, L"http://www.sym101.com/Users/FileUpLoad/EFTX\\%ws", Char2TCHAR(fname));
|
||||||
|
std::string ret = cli->Post(
|
||||||
|
tmpurl,
|
||||||
|
post_data.data(),
|
||||||
|
post_data.Count,
|
||||||
|
CONTENTTYPE_JSON);
|
||||||
|
delete tmp_postdata;
|
||||||
|
free((void*)data->begin());
|
||||||
|
printf_s("[%d/%d] 文件[%s]上传完毕\n", i + 1, argns - 1, fname);
|
||||||
|
}
|
||||||
|
catch (exception e)
|
||||||
|
{
|
||||||
|
printf_s("[%d/%d] 文件[%s]上传失败->%s\n", i + 1, argns - 1, fname,e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sleep(500);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//int main(int argns, char** args)
|
||||||
|
//{
|
||||||
|
// if (argns > 1)
|
||||||
|
// {
|
||||||
|
// const char key[] = "0123456789ABCDEF";
|
||||||
|
// for (int i = 0; i < argns - 1; i++)
|
||||||
|
// {
|
||||||
|
// const char* path = args[i + 1];
|
||||||
|
// char* fname = FindChar(path, '\\');
|
||||||
|
// if (fname)
|
||||||
|
// {
|
||||||
|
// fname += 1;
|
||||||
|
// char* fname1 = new char[strlen(fname)];
|
||||||
|
// memcpy(fname1, fname, strlen(fname) + 1);
|
||||||
|
// char* tmp_point = nullptr;
|
||||||
|
// while(tmp_point=FindChar(fname1, '.')) *tmp_point = '_';
|
||||||
|
//
|
||||||
|
// stringstream str;
|
||||||
|
// str << "#pragma once\n";
|
||||||
|
// str << "unsigned char " << fname1 << " []=\n";
|
||||||
|
// str << "{\n";
|
||||||
|
// auto data = ReadAllBytes(path);
|
||||||
|
// char tmp_value[] = {0,0,0};
|
||||||
|
// for (int i = 0; i < data->size(); i++)
|
||||||
|
// {
|
||||||
|
// unsigned char val= data->begin()[i];
|
||||||
|
// tmp_value[0] = key[val / 16];
|
||||||
|
// tmp_value[1] = key[val % 16];
|
||||||
|
// if (i < data->size() - 1)
|
||||||
|
// str << "0x" << tmp_value << ",";
|
||||||
|
// else
|
||||||
|
// str << "0x" << tmp_value;
|
||||||
|
// if ((i +1) % 19 == 0 && i != 0)
|
||||||
|
// {
|
||||||
|
// str << "\n";
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// str << "};\n";
|
||||||
|
// char out_path[2048] = { 0 };
|
||||||
|
// *fname = '\0';
|
||||||
|
// sprintf_s(out_path,"%s%s.h", path, fname1);
|
||||||
|
// WriteAllText(out_path, str.str().c_str());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// Sleep(500);
|
||||||
|
// }
|
||||||
|
// return 0;
|
||||||
|
//}
|
147
UpLoader/UpLoader.vcxproj
Normal file
147
UpLoader/UpLoader.vcxproj
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{b9e9ef11-138c-467c-8118-f87ed46f35a5}</ProjectGuid>
|
||||||
|
<RootNamespace>UpLoader</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="HTTP\CHttpHeader.cpp" />
|
||||||
|
<ClCompile Include="HTTP\HttpClient.cpp" />
|
||||||
|
<ClCompile Include="UpLoader.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="helper.h" />
|
||||||
|
<ClInclude Include="HTTP\CHttpHeader.h" />
|
||||||
|
<ClInclude Include="HTTP\HttpClient.h" />
|
||||||
|
<ClInclude Include="HTTP\http_common.h" />
|
||||||
|
<ClInclude Include="HTTP\http_defines.h" />
|
||||||
|
<ClInclude Include="List.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
51
UpLoader/UpLoader.vcxproj.filters
Normal file
51
UpLoader/UpLoader.vcxproj.filters
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="源文件">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="头文件">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="资源文件">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="HTTP">
|
||||||
|
<UniqueIdentifier>{e87857bb-1ee9-4862-ac07-6edbb1e175da}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="UpLoader.cpp">
|
||||||
|
<Filter>源文件</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="HTTP\CHttpHeader.cpp">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="HTTP\HttpClient.cpp">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="HTTP\CHttpHeader.h">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="HTTP\http_common.h">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="HTTP\http_defines.h">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="HTTP\HttpClient.h">
|
||||||
|
<Filter>HTTP</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="helper.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="List.h">
|
||||||
|
<Filter>头文件</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
563
UpLoader/helper.h
Normal file
563
UpLoader/helper.h
Normal file
@ -0,0 +1,563 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <WinInet.h>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <urlmon.h>
|
||||||
|
#include <Psapi.h>
|
||||||
|
#pragma comment(lib, "urlmon.lib")
|
||||||
|
#pragma comment(lib, "Wininet.lib")
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
#ifndef typeof
|
||||||
|
#define typeof(x) decltype(x)
|
||||||
|
#endif // !typeof
|
||||||
|
|
||||||
|
#ifndef PROPERTY
|
||||||
|
#define PROPERTY(t,n) __declspec( property (put = property__set_##n, get = property__get_##n)) t n
|
||||||
|
#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n
|
||||||
|
#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n
|
||||||
|
#define GET(t,n) t property__get_##n()
|
||||||
|
#define SET(t,n) void property__set_##n(const t& value)
|
||||||
|
#endif // !PROPERTY
|
||||||
|
|
||||||
|
#ifndef ENCRYPT_SYSTEM_TYPE
|
||||||
|
#define ENCRYPT_SYSTEM_TYPE(type,name)\
|
||||||
|
unsigned long long _##name;\
|
||||||
|
PROPERTY(type, name);\
|
||||||
|
GET(type, name)\
|
||||||
|
{\
|
||||||
|
unsigned long long tmpval = _##name ^ ((unsigned long long)&_##name);\
|
||||||
|
type result;\
|
||||||
|
memcpy(&result, &tmpval, sizeof(result));\
|
||||||
|
return result;\
|
||||||
|
}\
|
||||||
|
SET(type, name)\
|
||||||
|
{\
|
||||||
|
unsigned long long tmpval = 0;\
|
||||||
|
memcpy(&tmpval, &value, sizeof(value));\
|
||||||
|
_##name = tmpval ^ ((unsigned long long)&_##name);\
|
||||||
|
}
|
||||||
|
#endif // !ENCRYPT_SYSTEM_TYPE
|
||||||
|
|
||||||
|
#ifndef _IMAGE_DEBUG_DIRECTORY_RAW_
|
||||||
|
#define _IMAGE_DEBUG_DIRECTORY_RAW_
|
||||||
|
typedef struct _IMAGE_DEBUG_DIRECTORY_RAW {
|
||||||
|
uint8_t format[4];
|
||||||
|
uint8_t PdbSignature[16];
|
||||||
|
uint32_t PdbDbiAge;
|
||||||
|
uint8_t ImageName[256];
|
||||||
|
const char* GuidString()
|
||||||
|
{
|
||||||
|
char buf[128];
|
||||||
|
sprintf_s(buf, "%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X",
|
||||||
|
this->PdbSignature[3], this->PdbSignature[2],
|
||||||
|
this->PdbSignature[1], this->PdbSignature[0],
|
||||||
|
this->PdbSignature[5], this->PdbSignature[4],
|
||||||
|
this->PdbSignature[7], this->PdbSignature[6],
|
||||||
|
this->PdbSignature[8], this->PdbSignature[9],
|
||||||
|
this->PdbSignature[10], this->PdbSignature[11],
|
||||||
|
this->PdbSignature[12], this->PdbSignature[13],
|
||||||
|
this->PdbSignature[14], this->PdbSignature[15]
|
||||||
|
);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
} IMAGE_DEBUG_DIRECTORY_RAW, * PIMAGE_DEBUG_DIRECTORY_RAW;
|
||||||
|
#endif
|
||||||
|
#pragma region TPattern
|
||||||
|
|
||||||
|
class TPattern
|
||||||
|
{
|
||||||
|
std::string sMask;
|
||||||
|
std::string sPattern;
|
||||||
|
std::vector<uint8_t> bytes;
|
||||||
|
bool bIdaStyle = false;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Parse()
|
||||||
|
{
|
||||||
|
if (bIdaStyle)
|
||||||
|
{
|
||||||
|
ParsePatternIDA();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParsePattern();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ParsePattern()
|
||||||
|
{
|
||||||
|
auto uLen = sMask.length();
|
||||||
|
for (uint32_t i = 0; i < uLen; i++)
|
||||||
|
{
|
||||||
|
if (i < uLen && sPattern[i] == 0)
|
||||||
|
{
|
||||||
|
sPattern[i] = (char)0xFF;
|
||||||
|
}
|
||||||
|
if (sMask[i] == '?')
|
||||||
|
{
|
||||||
|
bytes.push_back(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto sub = sPattern.substr(i, 1);
|
||||||
|
auto byte = uint8_t(sub[0]);
|
||||||
|
bytes.push_back(byte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParsePatternIDA()
|
||||||
|
{
|
||||||
|
auto uLen = sPattern.length();
|
||||||
|
sMask.clear();
|
||||||
|
int b = 0;
|
||||||
|
char x, byteBuf = 0;
|
||||||
|
for (uint32_t i = 0; i < uLen; i++)
|
||||||
|
{
|
||||||
|
char c = (char)sPattern[i];
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
{
|
||||||
|
x = (0x0F & c);
|
||||||
|
byteBuf += (b) ? x : x << 4;
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
else if (c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f')
|
||||||
|
{
|
||||||
|
if (c > 0x46)
|
||||||
|
{
|
||||||
|
c -= 0x20;
|
||||||
|
}
|
||||||
|
x = c - 0x37;
|
||||||
|
byteBuf += (b) ? x : x << 4;
|
||||||
|
b++;
|
||||||
|
}
|
||||||
|
else if (c == '?')
|
||||||
|
{
|
||||||
|
if (sPattern[i + 1] == '?')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
bytes.push_back(0);
|
||||||
|
sMask += '?';
|
||||||
|
}
|
||||||
|
if (b > 1)
|
||||||
|
{
|
||||||
|
bytes.push_back(byteBuf);
|
||||||
|
b = 0;
|
||||||
|
byteBuf = 0;
|
||||||
|
sMask += 'x';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
|
||||||
|
TPattern(const char* sPattern)
|
||||||
|
{
|
||||||
|
bIdaStyle = true;
|
||||||
|
this->sPattern = sPattern;
|
||||||
|
Parse();
|
||||||
|
}
|
||||||
|
|
||||||
|
TPattern(const char* sPattern, const char* sMask)
|
||||||
|
{
|
||||||
|
this->sMask = sMask;
|
||||||
|
bytes.resize(this->sMask.length());
|
||||||
|
memcpy(&bytes[0], sPattern, bytes.size());
|
||||||
|
Parse();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t> Get()
|
||||||
|
{
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GetMask()
|
||||||
|
{
|
||||||
|
return sMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Size()
|
||||||
|
{
|
||||||
|
return bytes.size();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static void* Scan(void* pAddress, size_t size, TPattern* pattern)
|
||||||
|
{
|
||||||
|
auto pat = pattern->Get();
|
||||||
|
auto mask = pattern->GetMask();
|
||||||
|
uint8_t* pByte = (uint8_t*)pAddress;
|
||||||
|
size_t j = 0;
|
||||||
|
for (size_t i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (IsBadReadPtr(pByte + i, pat.size()))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pByte[i] == pat[j] || mask[j] == '?')
|
||||||
|
{
|
||||||
|
j++;
|
||||||
|
if (j == pat.size() - 1)
|
||||||
|
{
|
||||||
|
return (void*)((uintptr_t)pByte + i - pat.size() + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
static void* ScanPattern(const char* szModule, const char* sPattern)
|
||||||
|
{
|
||||||
|
TPattern* pattern = new TPattern(sPattern);
|
||||||
|
OutputDebugStringA(pattern->GetMask().c_str());
|
||||||
|
MODULEINFO mi{ };
|
||||||
|
GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(szModule), &mi, sizeof(mi));
|
||||||
|
|
||||||
|
LPVOID dwBaseAddress = mi.lpBaseOfDll;
|
||||||
|
const auto dwModuleSize = mi.SizeOfImage;
|
||||||
|
return Scan(dwBaseAddress, dwModuleSize - pattern->Size(), pattern);
|
||||||
|
}
|
||||||
|
template<typename T> T FindPattern(const char* szModule, std::string pattern, DWORD_PTR SizeOfImage = NULL)
|
||||||
|
{
|
||||||
|
#define INRANGE(x,a,b) (x >= a && x <= b)
|
||||||
|
#define getBits( x ) (INRANGE((x&(~0x20)),'A','F') ? ((x&(~0x20)) - 'A' + 0xa) : (INRANGE(x,'0','9') ? x - '0' : 0))
|
||||||
|
#define getByte( x ) (getBits(x[0]) << 4 | getBits(x[1]))
|
||||||
|
HMODULE hModule = GetModuleHandleA(szModule);
|
||||||
|
const char* pat = pattern.c_str();
|
||||||
|
DWORD_PTR firstMatch = 0;
|
||||||
|
DWORD_PTR rangeStart = (T)hModule;
|
||||||
|
MODULEINFO miModInfo;
|
||||||
|
if (!SizeOfImage)
|
||||||
|
GetModuleInformation(GetCurrentProcess(), hModule, &miModInfo, sizeof(MODULEINFO));
|
||||||
|
DWORD_PTR rangeEnd = SizeOfImage ? rangeStart + SizeOfImage : rangeStart + (DWORD_PTR)miModInfo.SizeOfImage;
|
||||||
|
for (DWORD_PTR pCur = rangeStart; pCur < rangeEnd; pCur++)
|
||||||
|
{
|
||||||
|
if (!*pat)
|
||||||
|
return (T)firstMatch;
|
||||||
|
|
||||||
|
if (*(PBYTE)pat == '\?' || *(BYTE*)pCur == getByte(pat))
|
||||||
|
{
|
||||||
|
if (!firstMatch)
|
||||||
|
firstMatch = pCur;
|
||||||
|
|
||||||
|
if (!pat[2])
|
||||||
|
return (T)firstMatch;
|
||||||
|
|
||||||
|
if (*(PWORD)pat == '\?\?' || *(PBYTE)pat != '\?')
|
||||||
|
pat += 3;
|
||||||
|
|
||||||
|
else
|
||||||
|
pat += 2; //one ?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pat = pattern.c_str();
|
||||||
|
firstMatch = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
static char* TCHAR2char(const wchar_t* STR)
|
||||||
|
{
|
||||||
|
int size = WideCharToMultiByte(CP_ACP, 0, STR, -1, NULL, 0, NULL, FALSE);
|
||||||
|
char* str = new char[sizeof(char) * size];
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, STR, -1, str, size, NULL, FALSE);
|
||||||
|
return str;
|
||||||
|
|
||||||
|
}
|
||||||
|
static wchar_t* Char2TCHAR(const char* _char)
|
||||||
|
{
|
||||||
|
int iLength;
|
||||||
|
iLength = MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, NULL, 0);
|
||||||
|
wchar_t* tchar = new wchar_t[sizeof(wchar_t) * iLength];
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, tchar, iLength);
|
||||||
|
return tchar;
|
||||||
|
}
|
||||||
|
static string wstring_to_string(wstring s)
|
||||||
|
{
|
||||||
|
return string(TCHAR2char(s.c_str()));
|
||||||
|
}
|
||||||
|
static wstring string_to_wstring(string s)
|
||||||
|
{
|
||||||
|
return wstring(Char2TCHAR(s.c_str()));
|
||||||
|
}
|
||||||
|
static char* ToHex(const char* data, size_t len)
|
||||||
|
{
|
||||||
|
const char* key = "0123456789ABCDEF";
|
||||||
|
char* result = new char[(len * 2) + 1];
|
||||||
|
result[(len * 2)] = '\0';
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
result[i * 2] = key[((unsigned char)data[i]) / 0x10];
|
||||||
|
result[(i * 2) + 1] = key[((unsigned char)data[i]) % 0x10];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static char* ToHex(const BYTE* data, size_t len)
|
||||||
|
{
|
||||||
|
const char* key = "0123456789ABCDEF";
|
||||||
|
char* result = new char[(len * 2) + 1];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
result[i * 2] = key[((unsigned char)data[i]) / 0x10];
|
||||||
|
result[(i * 2) + 1] = key[((unsigned char)data[i]) % 0x10];
|
||||||
|
}
|
||||||
|
result[len * 2] = '\0';
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static vector<BYTE> ParseHex(const char* hex)
|
||||||
|
{
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
int len = strlen(hex);
|
||||||
|
BYTE* buffer = new BYTE[len];
|
||||||
|
bool ish = true;
|
||||||
|
BYTE val = 0;
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
bool isval = false;
|
||||||
|
BYTE v = 0;
|
||||||
|
if (hex[i] >= '0' && hex[i] <= '9')
|
||||||
|
{
|
||||||
|
v = (hex[i] - '0');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
else if (hex[i] >= 'A' && hex[i] <= 'F')
|
||||||
|
{
|
||||||
|
v = 10 + (hex[i] - 'A');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
else if (hex[i] >= 'a' && hex[i] <= 'f')
|
||||||
|
{
|
||||||
|
v = 10 + (hex[i] - 'a');
|
||||||
|
isval = true;
|
||||||
|
}
|
||||||
|
if (isval)
|
||||||
|
{
|
||||||
|
if (ish)
|
||||||
|
{
|
||||||
|
val = (v << 4) | val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val = v | val;
|
||||||
|
result.push_back(val);
|
||||||
|
val = 0;
|
||||||
|
}
|
||||||
|
ish = !ish;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
static initializer_list<char>* ReadAllBytes(const char* filePath)
|
||||||
|
{
|
||||||
|
HANDLE pFile;
|
||||||
|
DWORD fileSize;
|
||||||
|
char* buffer, * tmpBuf;
|
||||||
|
DWORD dwBytesRead, dwBytesToRead, tmpLen;
|
||||||
|
|
||||||
|
pFile = CreateFileA(filePath,
|
||||||
|
GENERIC_READ,
|
||||||
|
FILE_SHARE_READ,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
if (pFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
fileSize = GetFileSize(pFile, NULL);
|
||||||
|
buffer = (char*)malloc(fileSize);
|
||||||
|
if (!buffer)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
ZeroMemory(buffer, fileSize);
|
||||||
|
dwBytesToRead = fileSize;
|
||||||
|
dwBytesRead = 0;
|
||||||
|
tmpBuf = buffer;
|
||||||
|
do {
|
||||||
|
if (!ReadFile(pFile, tmpBuf, dwBytesToRead, &dwBytesRead, NULL) || dwBytesRead == 0)
|
||||||
|
break;
|
||||||
|
dwBytesToRead -= dwBytesRead;
|
||||||
|
tmpBuf += dwBytesRead;
|
||||||
|
|
||||||
|
} while (dwBytesToRead > 0);
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return new initializer_list<char>(&buffer[0], &buffer[fileSize]);
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, char* buffer, int len)
|
||||||
|
{
|
||||||
|
HANDLE pFile;
|
||||||
|
char* tmpBuf;
|
||||||
|
DWORD dwBytesWrite, dwBytesToWrite;
|
||||||
|
|
||||||
|
pFile = CreateFileA(filePath,
|
||||||
|
GENERIC_WRITE,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (pFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseHandle(pFile);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwBytesToWrite = len;
|
||||||
|
dwBytesWrite = 0;
|
||||||
|
|
||||||
|
tmpBuf = buffer;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
WriteFile(pFile, tmpBuf, dwBytesToWrite, &dwBytesWrite, NULL);
|
||||||
|
|
||||||
|
dwBytesToWrite -= dwBytesWrite;
|
||||||
|
tmpBuf += dwBytesWrite;
|
||||||
|
|
||||||
|
} while (dwBytesToWrite > 0);
|
||||||
|
|
||||||
|
CloseHandle(pFile);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, BYTE* buffer, int len)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer, len);
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, vector<BYTE> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.data(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, initializer_list<BYTE> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.begin(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllBytes(const char* filePath, initializer_list<char> buffer)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)buffer.begin(), buffer.size());
|
||||||
|
}
|
||||||
|
static BOOL WriteAllText(const char* filePath, const char* text)
|
||||||
|
{
|
||||||
|
return WriteAllBytes(filePath, (char*)text, strlen(text));
|
||||||
|
}
|
||||||
|
static vector<BYTE> HttpRequest(const char* url)
|
||||||
|
{
|
||||||
|
#define MAXSIZE 4096
|
||||||
|
vector<BYTE> result = vector<BYTE>();
|
||||||
|
BYTE* val = new BYTE[MAXSIZE];
|
||||||
|
ULONG len = 1;
|
||||||
|
HINTERNET hSession = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
|
||||||
|
if (hSession != NULL)
|
||||||
|
{
|
||||||
|
HINTERNET hHttp = InternetOpenUrlA(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
|
||||||
|
|
||||||
|
if (hHttp != NULL)
|
||||||
|
{
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
InternetReadFile(hHttp, val, MAXSIZE - 1, &len);
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
int ldx = result.size();
|
||||||
|
result.resize(result.size() + len);
|
||||||
|
memcpy(&result.operator[](ldx), &val[0], len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InternetCloseHandle(hHttp);
|
||||||
|
hHttp = NULL;
|
||||||
|
}
|
||||||
|
InternetCloseHandle(hSession);
|
||||||
|
hSession = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static string WebRequest(const char* url)
|
||||||
|
{
|
||||||
|
#define BLOCK_READ 4096
|
||||||
|
IStream* stream;
|
||||||
|
HRESULT result = URLOpenBlockingStreamA(0, url, &stream, 0, 0);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
char buffer[BLOCK_READ];
|
||||||
|
unsigned long bytesRead;
|
||||||
|
stringstream ss;
|
||||||
|
stream->Read(buffer, BLOCK_READ, &bytesRead);
|
||||||
|
while (bytesRead > 0U)
|
||||||
|
{
|
||||||
|
ss.write(buffer, (long long)bytesRead);
|
||||||
|
stream->Read(buffer, BLOCK_READ, &bytesRead);
|
||||||
|
}
|
||||||
|
stream->Release();
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BYTE* _get_jmp_address(BYTE* ptr)
|
||||||
|
{
|
||||||
|
if (*ptr == 0xE9)
|
||||||
|
{
|
||||||
|
return (ptr + 5) + (*(UINT32*)&ptr[1]);
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
static int _get_index(BYTE* ptr)
|
||||||
|
{
|
||||||
|
if (*(UINT16*)ptr == 0x20FF)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (*(UINT16*)ptr == 0x60FF)
|
||||||
|
{
|
||||||
|
return ptr[2] / sizeof(void*);
|
||||||
|
}
|
||||||
|
if (*(UINT16*)ptr == 0xA0FF)
|
||||||
|
{
|
||||||
|
return *(UINT32*)&ptr[2] / sizeof(void*);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
static int GetVTableIndex(T funcaddr)
|
||||||
|
{
|
||||||
|
void* proc = (void*&)funcaddr;
|
||||||
|
BYTE* addr = _get_jmp_address((BYTE*)proc);
|
||||||
|
for (int i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
if (addr[i] == 0xFF)
|
||||||
|
{
|
||||||
|
auto dx = _get_index(&addr[i]);
|
||||||
|
if (dx >= 0) return dx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
static POINT GetMousePos(HWND Hwnd)
|
||||||
|
{
|
||||||
|
POINT p;
|
||||||
|
GetCursorPos(&p);
|
||||||
|
ScreenToClient(Hwnd, &p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
static bool InRect(POINT point, POINT LOC, SIZE SIZ)
|
||||||
|
{
|
||||||
|
int xf = point.x - LOC.x;
|
||||||
|
int yf = point.y - LOC.y;
|
||||||
|
return xf >= 0 && xf <= SIZ.cx &&
|
||||||
|
yf >= 0 && yf <= SIZ.cy;
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user