srcanamdw/codescanner/pyinstaller/versionInfo.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
# Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
# Based on previous work under copyright (c) 2001, 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
# This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
# modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
# This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
# GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
# You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
# along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
import win32api
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
import struct
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
import pywintypes
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
import string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
import pprint
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
TEST=0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
LOAD_LIBRARY_AS_DATAFILE = 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
RT_VERSION = 16
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
def getRaw0(o):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
    return o.raw
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
def getRaw1(o):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
    return str(buffer(o))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
import sys
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
if hasattr(sys, "version_info"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
    pyvers = sys.version_info[0]*10 + sys.version_info[1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
    toks = string.split(sys.version, '.', 2)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
    pyvers = int(toks[0])*10 + int(toks[1])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
if pyvers < 20:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
    getRaw = getRaw0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
    getRaw = getRaw1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
##VS_VERSION_INFO {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
##    WORD  wLength;        // Specifies the length of the VS_VERSION_INFO structure
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
##    WORD  wValueLength;   // Specifies the length of the Value member
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
##    WORD  wType;          // 1 means text, 0 means binary
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
##    WCHAR szKey[];        // Contains the Unicode string "VS_VERSION_INFO".
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
##    WORD  Padding1[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
##    VS_FIXEDFILEINFO Value;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
##    WORD  Padding2[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
##    WORD  Children[];     // Specifies a list of zero or more StringFileInfo or VarFileInfo structures (or both) that are children of the current version structure.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
def decode(pathnm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
    h = win32api.LoadLibraryEx(pathnm, 0, LOAD_LIBRARY_AS_DATAFILE)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
    nm = win32api.EnumResourceNames(h, RT_VERSION)[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
    data = win32api.LoadResource(h, RT_VERSION, nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
    vs = VSVersionInfo()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
    j = vs.fromRaw(data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
    if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
        print vs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
        if data[:j] != vs.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
            print "AAAAAGGHHHH"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
        txt = repr(vs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
        glbls = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
        glbls['VSVersionInfo'] = VSVersionInfo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
        glbls['FixedFileInfo'] = FixedFileInfo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
        glbls['StringFileInfo'] = StringFileInfo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
        glbls['StringTable'] = StringTable
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
        glbls['StringStruct'] = StringStruct
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
        glbls['VarFileInfo'] = VarFileInfo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
        glbls['VarStruct'] = VarStruct
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
        vs2 = eval(txt+'\n', glbls)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
        if vs.toRaw() != vs2.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
            print
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
            print 'reconstruction not the same!'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
            print vs2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
    win32api.FreeLibrary(h)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
    return vs
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
class VSVersionInfo:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
    def __init__(self, ffi=None, kids=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
        self.ffi = ffi
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        self.kids = kids
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
        if kids is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
            self.kids = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
    def fromRaw(self, data):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
        i, (sublen, vallen, wType, nm) = parseCommon(data)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
        #vallen is length of the ffi, typ is 0, nm is 'VS_VERSION_INFO'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
        i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
        # now a VS_FIXEDFILEINFO
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
        self.ffi = FixedFileInfo()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
        j = self.ffi.fromRaw(data, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
        #print ffi
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
        if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
            if data[i:j] != self.ffi.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
                print "raw:", `data[i:j]`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
                print "ffi:", `self.ffi.toRaw()`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
        i = j
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
        while i < sublen:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
            j = i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
            i, (csublen, cvallen, ctyp, nm) = parseCommon(data, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
            if string.strip(str(nm)) == "StringFileInfo":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
                sfi = StringFileInfo()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
                k = sfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
                if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
                    if data[j:k] != sfi.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
                        rd = data[j:k]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
                        sd = sfi.toRaw()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
                        for x in range(0, len(rd), 16):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
                            rds = rd[x:x+16]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
                            sds = sd[x:x+16]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
                            if rds != sds:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
                                print "rd[%s:%s+16]: %s" % (x, x, `rds`)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
                                print "sd[%s:%s+16]: %s" % (x, x, `sds`)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
                                print
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
                        print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
                        print "sfi: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
                self.kids.append(sfi)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
                i = k
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
                vfi = VarFileInfo()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
                k = vfi.fromRaw(csublen, cvallen, nm, data, i, j+csublen)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
                self.kids.append(vfi)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
                if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
                    if data[j:k] != vfi.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
                        print "raw:", `data[j:k]`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
                        print "vfi:", `vfi.toRaw()`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
                i = k
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
            i = j + csublen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
            i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
        nm = pywintypes.Unicode('VS_VERSION_INFO')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
        rawffi = self.ffi.toRaw()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
        vallen = len(rawffi)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
        typ = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
        sublen = 6 + 2*len(nm) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
        pad = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
            pad = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
        sublen = sublen + len(pad) + vallen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
        pad2 = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
            pad2 = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
            tmp.append(kid.toRaw())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
        tmp = string.join(tmp, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
        sublen = sublen + len(pad2) + len(tmp)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
        return struct.pack('hhh', sublen, vallen, typ) + getRaw(nm) + '\000\000' + pad + rawffi + pad2 + tmp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
        newindent = indent + '  '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
            tmp.append(kid.__repr__(newindent+'  '))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
        tmp = string.join(tmp, ', \n')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
        return "VSVersionInfo(\n%sffi=%s,\n%skids=[\n%s\n%s]\n)" % (newindent, self.ffi.__repr__(newindent), newindent, tmp, newindent)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
def parseCommon(data, start=0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
    i = start + 6
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
    (wLength, wValueLength, wType) = struct.unpack('3h', data[start:i])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
    #print "wLength, wValueLength, wType, i:", wLength, wValueLength, wType, i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
    i, szKey = parseUString(data, i, i+wLength)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
    #i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
    #print `data[start+6:start+wLength]`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
    return i, (wLength, wValueLength, wType, szKey)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
def parseUString(data, start, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
    i = start
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
    while i < limit:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
        if data[i:i+2] == '\000\000':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
            break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
        i = i + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
    szKey = pywintypes.UnicodeFromRaw(data[start:i])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
    i = i + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
    #print "szKey:", '"'+str(szKey)+'"', "(consumed", i-start, "bytes - to", i, ")"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
    return i, szKey
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
##VS_FIXEDFILEINFO {  // vsffi
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
##    DWORD dwSignature;        //Contains the value 0xFEEFO4BD
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
##    DWORD dwStrucVersion;     //Specifies the binary version number of this structure. The high-order word of this member contains the major version number, and the low-order word contains the minor version number.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
##    DWORD dwFileVersionMS;    // Specifies the most significant 32 bits of the file's binary version number
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
##    DWORD dwFileVersionLS;    //
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
##    DWORD dwProductVersionMS; // Specifies the most significant 32 bits of the binary version number of the product with which this file was distributed
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
##    DWORD dwProductVersionLS; //
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
##    DWORD dwFileFlagsMask;    // Contains a bitmask that specifies the valid bits in dwFileFlags. A bit is valid only if it was defined when the file was created.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
##    DWORD dwFileFlags;        // VS_FF_DEBUG, VS_FF_PATCHED etc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
##    DWORD dwFileOS;           // VOS_NT, VOS_WINDOWS32 etc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
##    DWORD dwFileType;         // VFT_APP etc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
##    DWORD dwFileSubtype;      // 0 unless VFT_DRV or VFT_FONT or VFT_VXD
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
##    DWORD dwFileDateMS;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
##    DWORD dwFileDateLS;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
class FixedFileInfo:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
    def __init__(self, filevers=(0, 0, 0, 0), prodvers=(0, 0, 0, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
        self.sig = 0xfeef04bdL
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
        self.strucVersion = 0x10000
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
        self.fileVersionMS = (filevers[0] << 16) | (filevers[1] & 0xffff)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
        self.fileVersionLS = (filevers[2] << 16) | (filevers[3] & 0xffff)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
        self.productVersionMS = (prodvers[0] << 16) | (prodvers[1] & 0xffff)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
        self.productVersionLS = (prodvers[2] << 16) | (prodvers[3] & 0xffff)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
        self.fileFlagsMask = mask
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
        self.fileFlags = flags
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
        self.fileOS = OS
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
        self.fileType = fileType
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
        self.fileSubtype = subtype
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
        self.fileDateMS = date[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
        self.fileDateLS = date[1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
    def fromRaw(self, data, i):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
        (self.sig,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
         self.strucVersion,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
         self.fileVersionMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
         self.fileVersionLS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
         self.productVersionMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
         self.productVersionLS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
         self.fileFlagsMask,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
         self.fileFlags,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
         self.fileOS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
         self.fileType,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
         self.fileSubtype,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
         self.fileDateMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
         self.fileDateLS) = struct.unpack('13l', data[i:i+52])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
        return i+52
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
        return struct.pack('L12l', self.sig,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
                             self.strucVersion,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
                             self.fileVersionMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
                             self.fileVersionLS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
                             self.productVersionMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
                             self.productVersionLS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
                             self.fileFlagsMask,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
                             self.fileFlags,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
                             self.fileOS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
                             self.fileType,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
                             self.fileSubtype,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
                             self.fileDateMS,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
                             self.fileDateLS)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
        fv = (self.fileVersionMS >> 16, self.fileVersionMS & 0xffff, self.fileVersionLS >> 16, self.fileVersionLS & 0xFFFF)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
        pv = (self.productVersionMS >> 16, self.productVersionMS & 0xffff, self.productVersionLS >> 16, self.productVersionLS & 0xFFFF)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
        fd = (self.fileDateMS, self.fileDateLS)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   244
        tmp = ["FixedFileInfo(",
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   245
               "filevers=%s," % (fv,),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   246
               "prodvers=%s," % (pv,),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   247
               "mask=%s," % hex(self.fileFlagsMask),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   248
               "flags=%s," % hex(self.fileFlags),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   249
               "OS=%s," % hex(self.fileOS),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   250
               "fileType=%s," % hex(self.fileType),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   251
               "subtype=%s," % hex(self.fileSubtype),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   252
               "date=%s" % (fd,),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   253
               ")"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   254
              ]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   255
        return string.join(tmp, '\n'+indent+'  ')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   256
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   257
##StringFileInfo {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   258
##    WORD        wLength;      // Specifies the length of the version resource
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   259
##    WORD        wValueLength; // Specifies the length of the Value member in the current VS_VERSION_INFO structure
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   260
##    WORD        wType;        // 1 means text, 0 means binary
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   261
##    WCHAR       szKey[];      // Contains the Unicode string "StringFileInfo".
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   262
##    WORD        Padding[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   263
##    StringTable Children[];   // Specifies a list of zero or more String structures
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   264
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   265
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   266
class StringFileInfo:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   267
    def __init__(self, kids=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   268
        self.name = "StringFileInfo"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   269
        if kids is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   270
            self.kids = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   271
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   272
            self.kids = kids
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   273
    def fromRaw(self, sublen, vallen, name, data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   274
        self.name = name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   275
        while i < limit:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   276
            st = StringTable()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   277
            j = st.fromRaw(data, i, limit)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   278
            if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   279
                if data[i:j] != st.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   280
                    rd = data[i:j]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   281
                    sd = st.toRaw()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   282
                    for x in range(0, len(rd), 16):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   283
                        rds = rd[x:x+16]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   284
                        sds = sd[x:x+16]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   285
                        if rds != sds:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   286
                            print "rd[%s:%s+16]: %s" % (x, x, `rds`)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   287
                            print "sd[%s:%s+16]: %s" % (x, x, `sds`)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   288
                            print
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   289
                    print "raw: len %d, wLength %d" % (len(rd), struct.unpack('h', rd[:2])[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   290
                    print " st: len %d, wLength %d" % (len(sd), struct.unpack('h', sd[:2])[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   291
            self.kids.append(st)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   292
            i = j
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   293
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   294
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   295
        if type(self.name) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   296
            self.name = pywintypes.Unicode(self.name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   297
        vallen = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   298
        typ = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   299
        sublen = 6 + 2*len(self.name) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   300
        pad = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   301
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   302
            pad = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   303
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   304
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   305
            tmp.append(kid.toRaw())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   306
        tmp = string.join(tmp, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   307
        sublen = sublen + len(pad) + len(tmp)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   308
        if tmp[-2:] == '\000\000':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   309
            sublen = sublen - 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   310
        return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + tmp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   311
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   312
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   313
        newindent = indent + '  '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   314
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   315
            tmp.append(kid.__repr__(newindent))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   316
        tmp = string.join(tmp, ', \n')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   317
        return "%sStringFileInfo(\n%s[\n%s\n%s])" % (indent, newindent, tmp, newindent)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   318
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   319
##StringTable {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   320
##    WORD   wLength;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   321
##    WORD   wValueLength;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   322
##    WORD   wType;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   323
##    WCHAR  szKey[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   324
##    String Children[];    // Specifies a list of zero or more String structures.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   325
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   326
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   327
class StringTable:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   328
    def __init__(self, name=None, kids=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   329
        self.name = name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   330
        self.kids = kids
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   331
        if name is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   332
            self.name = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   333
        if kids is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   334
            self.kids = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   335
    def fromRaw(self, data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   336
        #print "Parsing StringTable"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   337
        i, (cpsublen, cpwValueLength, cpwType, self.name) = parseCodePage(data, i, limit) # should be code page junk
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   338
        #i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   339
        while i < limit:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   340
            ss = StringStruct()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   341
            j = ss.fromRaw(data, i, limit)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   342
            if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   343
                if data[i:j] != ss.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   344
                    print "raw:", `data[i:j]`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   345
                    print " ss:", `ss.toRaw()`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   346
            i = j
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   347
            self.kids.append(ss)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   348
            i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   349
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   350
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   351
        if type(self.name) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   352
            self.name = pywintypes.Unicode(self.name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   353
        vallen = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   354
        typ = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   355
        sublen = 6 + 2*len(self.name) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   356
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   357
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   358
            raw = kid.toRaw()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   359
            if len(raw) % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   360
                raw = raw + '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   361
            tmp.append(raw)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   362
        tmp = string.join(tmp, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   363
        sublen = sublen + len(tmp)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   364
        if tmp[-2:] == '\000\000':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   365
            sublen = sublen - 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   366
        return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + tmp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   367
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   368
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   369
        newindent = indent + '  '
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   370
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   371
            tmp.append(repr(kid))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   372
        tmp = string.join(tmp, ',\n%s' % newindent)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   373
        return "%sStringTable(\n%s'%s', \n%s[%s])" % (indent, newindent, str(self.name), newindent, tmp)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   374
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   375
##String {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   376
##    WORD   wLength;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   377
##    WORD   wValueLength;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   378
##    WORD   wType;
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   379
##    WCHAR  szKey[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   380
##    WORD   Padding[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   381
##    String Value[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   382
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   383
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   384
class StringStruct:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   385
    def __init__(self, name=None, val=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   386
        self.name = name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   387
        self.val = val
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   388
        if name is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   389
            self.name = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   390
        if val is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   391
            self.val = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   392
    def fromRaw(self, data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   393
        i, (sublen, vallen, typ, self.name) = parseCommon(data, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   394
        limit = i + sublen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   395
        i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   396
        i, self.val = parseUString(data, i, limit)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   397
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   398
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   399
        if type(self.name) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   400
            self.name = pywintypes.Unicode(self.name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   401
        if type(self.val) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   402
            self.val = pywintypes.Unicode(self.val)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   403
        vallen = len(self.val) + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   404
        typ = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   405
        sublen = 6 + 2*len(self.name) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   406
        pad = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   407
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   408
            pad = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   409
        sublen = sublen + len(pad) + 2*vallen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   410
        return struct.pack('hhh', sublen, vallen, typ) + getRaw(self.name) + '\000\000' + pad + getRaw(self.val) + '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   411
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   412
        if pyvers < 20:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   413
            return "StringStruct('%s', '%s')" % (str(self.name), str(self.val))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   414
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   415
            return "StringStruct('%s', '%s')" % (self.name, self.val)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   416
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   417
def parseCodePage(data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   418
    #print "Parsing CodePage"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   419
    i, (sublen, wValueLength, wType, nm) = parseCommon(data, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   420
    #i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   421
    return i, (sublen, wValueLength, wType, nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   422
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   423
##VarFileInfo {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   424
##    WORD  wLength;        // Specifies the length of the version resource
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   425
##    WORD  wValueLength;   // Specifies the length of the Value member in the current VS_VERSION_INFO structure
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   426
##    WORD  wType;          // 1 means text, 0 means binary
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   427
##    WCHAR szKey[];        // Contains the Unicode string "VarFileInfo".
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   428
##    WORD  Padding[];
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   429
##    Var   Children[];     // Specifies a list of zero or more Var structures
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   430
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   431
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   432
class VarFileInfo:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   433
    def __init__(self, kids=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   434
        if kids is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   435
            self.kids = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   436
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   437
            self.kids = kids
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   438
    def fromRaw(self, sublen, vallen, name, data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   439
        self.sublen = sublen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   440
        self.vallen = vallen
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   441
        self.name = name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   442
        i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   443
        while i < limit:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   444
            vs = VarStruct()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   445
            j = vs.fromRaw(data, i, limit)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   446
            self.kids.append(vs)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   447
            if TEST:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   448
                if data[i:j] != vs.toRaw():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   449
                    print "raw:", `data[i:j]`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   450
                    print "cmp:", `vs.toRaw()`
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   451
            i = j
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   452
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   453
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   454
        self.vallen = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   455
        self.wType = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   456
        self.name = pywintypes.Unicode('VarFileInfo')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   457
        sublen = 6 + 2*len(self.name) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   458
        pad = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   459
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   460
            pad = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   461
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   462
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   463
            tmp.append(kid.toRaw())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   464
        tmp = string.join(tmp, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   465
        self.sublen = sublen + len(pad) + len(tmp)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   466
        return struct.pack('hhh', self.sublen, self.vallen, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   467
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   468
        tmp = map(repr, self.kids)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   469
        return "%sVarFileInfo([%s])" % (indent, string.join(tmp, ', '))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   470
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   471
##Var {
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   472
##    WORD  wLength;        // Specifies the length of the version resource
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   473
##    WORD  wValueLength;   // Specifies the length of the Value member in the current VS_VERSION_INFO structure
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   474
##    WORD  wType;          // 1 means text, 0 means binary
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   475
##    WCHAR szKey[];        // Contains the Unicode string "Translation" or a user-defined key string value
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   476
##    WORD  Padding[];      //
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   477
##    WORD  Value[];        // Specifies a list of one or more values that are language and code-page identifiers
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   478
##};
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   479
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   480
STRINGTYPE = type('')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   481
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   482
class VarStruct:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   483
    def __init__(self, name=None, kids=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   484
        self.name = name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   485
        self.kids = kids
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   486
        if name is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   487
            self.name = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   488
        if kids is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   489
            self.kids = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   490
    def fromRaw(self, data, i, limit):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   491
        i, (self.sublen, self.wValueLength, self.wType, self.name) = parseCommon(data, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   492
        i = ((i + 3) / 4) * 4
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   493
        for j in range(self.wValueLength/2):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   494
            kid = struct.unpack('h', data[i:i+2])[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   495
            self.kids.append(kid)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   496
            i = i + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   497
        return i
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   498
    def toRaw(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   499
        self.wValueLength = len(self.kids) * 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   500
        self.wType = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   501
        if type(self.name) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   502
            self.name = pywintypes.Unicode(self.name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   503
        sublen = 6 + 2*len(self.name) + 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   504
        pad = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   505
        if sublen % 4:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   506
            pad = '\000\000'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   507
        self.sublen = sublen + len(pad) + self.wValueLength
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   508
        tmp = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   509
        for kid in self.kids:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   510
            tmp.append(struct.pack('h', kid))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   511
        tmp = string.join(tmp, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   512
        return struct.pack('hhh', self.sublen, self.wValueLength, self.wType) + getRaw(self.name) + '\000\000' + pad + tmp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   513
    def __repr__(self, indent=''):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   514
        return "VarStruct('%s', %s)" % (str(self.name), repr(self.kids))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   515
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   516
def SetVersion(exenm, versionfile):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   517
    txt = open(versionfile, 'r').read()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   518
    vs = eval(txt+'\n', globals())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   519
    hdst = win32api.BeginUpdateResource(exenm, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   520
    win32api.UpdateResource(hdst, RT_VERSION, 1, vs.toRaw())
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   521
    win32api.EndUpdateResource (hdst, 0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   522
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   523
if __name__ == '__main__':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   524
    import sys
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   525
    TEST = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   526
    if len(sys.argv) < 2:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   527
        decode('c:/Program Files/Netscape/Communicator/Program/netscape.exe')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   528
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   529
        print "Examining", sys.argv[1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   530
        decode(sys.argv[1])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   531