param(
|
[Parameter(Mandatory = $true, Position = 0)]
|
[ValidateSet('--mode=EXIT0', '--mode=EXIT7', '--mode=SLEEP_TIMEOUT', '--mode=COPYFAIL', '--mode=SIDECAR_CONFLICT')]
|
[string]$Mode
|
)
|
|
Set-StrictMode -Version Latest
|
$ErrorActionPreference = 'Stop'
|
|
function Get-AnaSemiArgvFingerprint {
|
param([string[]]$LogicalArgv)
|
$domain = [Text.Encoding]::UTF8.GetBytes('ANA-SEMI-ARGV-V001')
|
$stream = New-Object IO.MemoryStream
|
try {
|
$stream.Write($domain, 0, $domain.Length)
|
foreach ($token in $LogicalArgv) {
|
$stream.WriteByte(0)
|
$bytes = [Text.Encoding]::UTF8.GetBytes($token)
|
$stream.Write($bytes, 0, $bytes.Length)
|
}
|
$sha = [Security.Cryptography.SHA256]::Create()
|
try {
|
return ([BitConverter]::ToString($sha.ComputeHash($stream.ToArray())).Replace('-', '').ToLowerInvariant())
|
}
|
finally {
|
$sha.Dispose()
|
}
|
}
|
finally {
|
$stream.Dispose()
|
}
|
}
|
|
function Write-AnaSemiNativeBytes {
|
param(
|
[IO.Stream]$Stream,
|
[byte[]]$Bytes
|
)
|
$Stream.Write($Bytes, 0, $Bytes.Length)
|
$Stream.Flush()
|
}
|
|
$actualArgv = [Environment]::GetCommandLineArgs()
|
$fingerprint = Get-AnaSemiArgvFingerprint -LogicalArgv $actualArgv
|
$echo = [Text.Encoding]::UTF8.GetBytes(('ARGV_ECHO_V001' + [char]9 + $actualArgv.Length + [char]9 + $fingerprint + [char]10))
|
$stdout = [Console]::OpenStandardOutput()
|
$stderr = [Console]::OpenStandardError()
|
try {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes $echo
|
switch -CaseSensitive ($Mode) {
|
'--mode=EXIT0' {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes ([Text.Encoding]::UTF8.GetBytes("OUT0`n"))
|
exit 0
|
}
|
'--mode=EXIT7' {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes ([Text.Encoding]::UTF8.GetBytes("OUT7`n"))
|
Write-AnaSemiNativeBytes -Stream $stderr -Bytes ([Text.Encoding]::UTF8.GetBytes("ERR7`n"))
|
exit 7
|
}
|
'--mode=SLEEP_TIMEOUT' {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes ([Text.Encoding]::UTF8.GetBytes("SLEEP`n"))
|
[Threading.Thread]::Sleep(60000)
|
exit 0
|
}
|
'--mode=COPYFAIL' {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes ([Text.Encoding]::UTF8.GetBytes("COPYFAIL`n"))
|
exit 0
|
}
|
'--mode=SIDECAR_CONFLICT' {
|
Write-AnaSemiNativeBytes -Stream $stdout -Bytes ([Text.Encoding]::UTF8.GetBytes("OUT0`n"))
|
exit 0
|
}
|
}
|
}
|
finally {
|
$stdout.Dispose()
|
$stderr.Dispose()
|
}
|