public MSG_S2C_HEADER(DWORD uid, WORD protocol)
 {
     dwPCID    = uid;
     byCtrl    = 0x03;
     byCmd     = 0xFF;
     wProtocol = protocol;
 }
Beispiel #2
0
        void SendCmd(WORD wDevID, BYTE wCmdOrAck, int nParam)
        {
            CMD_PKT pkt = new CMD_PKT();

            BYTE[] pktBuffer = new BYTE[12];

            pkt.Head1   = (BYTE)COMMAND_START_CODE1;
            pkt.Head2   = (BYTE)COMMAND_START_CODE2;
            pkt.wDevId0 = (byte)(wDevID & 0xFF);
            pkt.wDevId1 = (byte)(wDevID >> 8);
            pkt.nParam0 = (byte)(nParam & 0xFF);
            pkt.nParam1 = (byte)((nParam & 0xFF00) >> 8);
            pkt.nParam2 = (byte)((nParam & 0xFF0000) >> 16);
            pkt.nParam3 = (byte)((nParam & 0xFF000000) >> 24);
            pkt.wCmd0   = wCmdOrAck;
            pkt.wCmd1   = 0x00;
            WORD chksum = CalcChkSumOfCmd(ref pkt);

            pkt.wChkSum0 = (byte)(chksum % 256);
            pkt.wChkSum1 = (byte)(chksum >> 8);

            pktBuffer = PktToByteArray(ref pkt);

            serial.Write(pktBuffer, 0, PKT_SIZE);
        }
Beispiel #3
0
 public static extern Boolean SetupDiGetDeviceInterfaceDetail(
     HDEVINFO DeviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
     IntPtr DeviceInterfaceDetailData,  //ref SP_DEVICE_INTERFACE_DETAIL_DATA
     DWORD DeviceInterfaceDetailDataSize,
     ref WORD RequiredSize,
     IntPtr DeviceInfoData                     //ref SP_DEVINFO_DATA
     );
Beispiel #4
0
        public WORD readWord(ushort address)
        {
            var word = new WORD();

            word.low  = data[address];
            word.high = data[address + 1];
            return(word);
        }
Beispiel #5
0
        static public WORD BCDToWORD(byte[] bcd)
        {
            WORD result = 0;

            result += (WORD)(1000 * (bcd[0] >> 4));
            result += (WORD)(100 * (bcd[0] & 0xf));
            result += (WORD)(10 * (bcd[1] >> 4));
            result += (WORD)(bcd[1] & 0xf);
            return(result);
        }
Beispiel #6
0
        WORD CalcChkSumOfDataPkt(ref BYTE[] DataPkt, int nSize)
        {
            int  i;
            WORD wChkSum = 0;

            for (i = 0; i < nSize; i++)
            {
                wChkSum += DataPkt[i];
            }
            return(wChkSum);
        }
Beispiel #7
0
        WORD CalcChkSumOfCmd(ref CMD_PKT pPkt)
        {
            WORD wChkSum = 0;

            BYTE[] Buf = PktToByteArray(ref pPkt);
            int    i;

            for (i = 0; i < (PKT_SIZE - CHK_SUM_SIZE); i++)
            {
                wChkSum += Buf[i];
            }
            return(wChkSum);
        }
Beispiel #8
0
 public BITMAPINFOHEADER(int width, int height)
 {
     biSize          = (uint)Marshal.SizeOf <BITMAPINFOHEADER>();
     biWidth         = width;
     biHeight        = -height;
     biPlanes        = 1;
     biBitCount      = 32;
     biCompression   = BI_RGB;
     biSizeImage     = 0;
     biXPelsPerMeter = 0;
     biYPelsPerMeter = 0;
     biClrUsed       = 0;
     biClrImportant  = 0;
 }
Beispiel #9
0
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            comboBox_COM.Items.AddRange(ports);

            textBox_IMEI.Enabled = false;
            //textBox_SIMNUM.Enabled = false;

            //textBox_STFWPASS.Text = "LteWater_0122.bin";

            StreamReader pth = new StreamReader("C:\\LTEW\\STFW\\STFW.txt", Encoding.Default);
            string       WORD;

            while ((WORD = pth.ReadLine()) != null)
            {
                string[] sbuf = WORD.Split(',');
                textBox_STFWPASS.Text = sbuf[0];
                textBox_STFWVER.Text  = sbuf[1];
            }
            pth.Close();

            StreamReader dis = new StreamReader("C:\\LTEW\\tools\\distance.txt", Encoding.Default);
            string       dist;

            dist = dis.ReadLine();
            textBox_TESTDIS.Text = dist;
            dis.Close();

            StreamReader volt = new StreamReader("C:\\LTEW\\tools\\voltage.txt", Encoding.Default);
            string       voltage;

            voltage = volt.ReadLine();
            textBox_voltage.Text = voltage;
            volt.Close();

            StreamReader pro = new StreamReader("C:\\LTEW\\tools\\Product.csv", Encoding.Default);
            string       PRONUM;
            int          i = 0;

            while ((PRONUM = pro.ReadLine()) != null)
            {
                i++;
            }
            i = i - 1;
            textBox_COUNT.Text = i.ToString();
            pro.Close();
        }
Beispiel #10
0
        public int Length = 78;         // just an estimate, better defined after write() is called

        public PDBHeader(string _name, int recCount)
        {
            DWORD dateNow = makeDate(DateTime.Now);

            name               = _name;
            attributes         = 0x08;
            version            = 0x01;
            creationDate       = dateNow;
            modificationDate   = dateNow;
            lastBackupDate     = dateNow;
            modificationNumber = 0x0006;
            appInfoID          = 0x0000;
            sortInfoID         = 0x0000;
            unqueIDSeed        = 0x0000;
            nextRecordistID    = 0x0000;
            numRecords         = (ushort)recCount;
        }
Beispiel #11
0
        public static void 音声認識()
        {
            Task.Run(() =>
            {
                try
                {
                    word = WORD.NON;//毎回初期化

                    var wordList = new List <string>();
                    foreach (var w in Enum.GetValues(typeof(WORD)))
                    {
                        wordList.Add(((WORD)w).ToString());
                    }

                    State.VmTestStatus.音声認識率 = "音声一致率 ----";
                    //語彙登録
                    Choices words = new Choices(wordList.ToArray());
                    sre.LoadGrammar(new Grammar(new GrammarBuilder(words)));

                    //入力ソース(既定のマイク)
                    sre.SetInputToDefaultAudioDevice();//マイクが接続されていないとここで例外が発生する


                    Flags.FlagStop音声認識 = false;
                    sre.RecognizeAsync(RecognizeMode.Multiple);//非同期で認識開始

                    while (true)
                    {
                        if (Flags.FlagStop音声認識)
                        {
                            sre.RecognizeAsyncCancel();
                            sre.RecognizeAsyncStop();
                            break;
                        }
                    }
                }
                catch
                {
                    MessageBox.Show("マイク接続異常\r\nアプリケーションを閉じます");
                    Environment.Exit(0);
                }
                finally
                {
                }
            });
        }
Beispiel #12
0
        public Instruction(WORD word)
        {
            code = word.toShort();

            if ((code >> 10) == 0x04)
            {
                type = InstructionType.SingleOperand;
            }
            else if ((code >> 13) == 0x01)
            {
                type = InstructionType.Jump;
            }
            else
            {
                type = InstructionType.TwoOperand;
            }
        }
Beispiel #13
0
 public bool EqualTokenType(int index, WORD tokenType)
 {
     try
     {
         if (TokenList[index].TokenType == tokenType)
         {
             return(true);
         }
         else
         {
             return(false);
         }
     }
     catch (Exception)
     {
         return(false);
     }
 }
Beispiel #14
0
        public WordMemories(string Code, int Size)
        {
            if (Size < 1)
            {
                throw new Exception("Size는 1이상");
            }
            if (!Regex.IsMatch(Code.ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase))
            {
                throw new Exception("Code는 알파벳으로");
            }

            this.RawData = new byte[Size * 2];
            this.Code    = Code.ToUpper();

            W = new WORD[Size];
            for (int i = 0; i < W.Length; i++)
            {
                W[i] = new WORD(this, i * 2);
            }
        }
Beispiel #15
0
        int ReceiveData(WORD wDevID, ref BYTE[] pBuf, int nSize, DWORD timeout)
        {
            WORD wReceivedChkSum, wChkSum;

            BYTE[] CommBuf;
            int    nReceivedBytes;

            if (pBuf == null)
            {
                return(PKT_PARAM_ERR);
            }

            CommBuf        = new BYTE[nSize + HEADER_SIZE + DEV_ID_SIZE + CHK_SUM_SIZE];
            nReceivedBytes = serial.Read(CommBuf, 0, nSize + HEADER_SIZE + DEV_ID_SIZE + CHK_SUM_SIZE);
            if (nReceivedBytes != nSize + HEADER_SIZE + DEV_ID_SIZE + CHK_SUM_SIZE)
            {
                return(PKT_COMM_ERR);
            }

            wReceivedChkSum = (WORD)((WORD)(CommBuf[nSize + HEADER_SIZE + DEV_ID_SIZE + 1] << 0x08) | (WORD)(CommBuf[nSize + HEADER_SIZE + DEV_ID_SIZE]));

            if ((CommBuf[0] != DATA_START_CODE1) || (CommBuf[1] != DATA_START_CODE2))
            {
                return(PKT_HDR_ERR);
            }

            for (int i = 0; i < nSize; i++)
            {
                pBuf[i] = CommBuf[i + HEADER_SIZE + DEV_ID_SIZE];
            }

            wChkSum = CalcChkSumOfDataPkt(ref CommBuf, HEADER_SIZE + DEV_ID_SIZE + nSize);

            if (wChkSum != wReceivedChkSum)
            {
                return(PKT_CHK_SUM_ERR);
            }
            return(0);
        }
Beispiel #16
0
        // --------------------------------------------------------------------

        private static string PluralizeWord(string word)
        {
            RegexRule[] rules = PLURAL_RULES;

            var lword = word.ToLower();

            if (!WORD.IsMatch(word) ||
                Array.IndexOf(MODALS, lword) > -1)
            {
                return(word);
            }

            for (int i = 0; i < rules.Length; i++)
            {
                if (rules[i].applies(lword))
                {
                    return(rules[i].fire(word));
                }
            }

            return(DEFAULT_PLURAL.fire(word));
        }
Beispiel #17
0
        public CGT511C1(int nPort, int dwBaudrate)
        {
            //serial = new SerialPort ( "COM"+nPort.ToString() , 9600, Parity.None, 8, StopBits.One);
            //uwDevID = DEVICE_ID;
            //CommTimeOut = COMM_DEF_TIMEOUT;
            //gwLastAck = 0;
            //gwLastAckParam = 0;
            //serial.ReadTimeout = (int)CommTimeOut;

            serial             = new SerialPort("COM" + nPort.ToString(), 9600, Parity.None, 8, StopBits.One);
            uwDevID            = DEVICE_ID;
            CommTimeOut        = COMM_DEF_TIMEOUT;
            gwLastAck          = 0;
            gwLastAckParam     = 0;
            serial.ReadTimeout = (int)CommTimeOut;
            serial.Open();
            change_baudrate(dwBaudrate);
            serial.Close();
            serial             = new SerialPort("COM" + nPort.ToString(), dwBaudrate, Parity.None, 8, StopBits.One);
            serial.ReadTimeout = (int)CommTimeOut;

            open();
        }
Beispiel #18
0
        int ReceiveCmd(WORD wDevID, ref WORD wCmd, ref int nParam)
        {
            CMD_PKT pkt;

            BYTE[] CommBuf;
            int    nReceivedBytes;

            CommBuf        = new BYTE[12];
            nReceivedBytes = serial.Read(CommBuf, 0, PKT_SIZE);
            if (nReceivedBytes != PKT_SIZE)
            {
                return(PKT_COMM_ERR);
            }

            if ((CommBuf[0] != COMMAND_START_CODE1) || (CommBuf[1] != COMMAND_START_CODE2))
            {
                return(PKT_HDR_ERR);
            }

            pkt = ByteArrayToPkt(ref CommBuf);

            WORD chksum = CalcChkSumOfCmd(ref pkt);

            pkt.wChkSum0 = (byte)(chksum % 256);
            pkt.wChkSum1 = (byte)(chksum >> 8);

            if ((pkt.wChkSum0 != (byte)(chksum % 256)) ||
                (pkt.wChkSum1 != (byte)(chksum >> 8)))
            {
                return(PKT_CHK_SUM_ERR);
            }

            wCmd   = (WORD)(pkt.wCmd1 << 8 | pkt.wCmd0);
            nParam = pkt.nParam1 << 8 | pkt.nParam0;

            return(0);
        }
Beispiel #19
0
        public WordMemories(string Code, byte[] RawData)
        {
            if (RawData == null)
            {
                throw new Exception("RawData는 null일 수 없음");
            }
            if (RawData.Length % 2 != 0)
            {
                throw new Exception("RawData의 크기는 2의 배수이어야 함");
            }
            if (!Regex.IsMatch(Code.ToString(), "[a-zA-Z]", RegexOptions.IgnoreCase))
            {
                throw new Exception("Code는 알파벳으로");
            }

            this.RawData = RawData;
            this.Code    = Code.ToUpper();

            W = new WORD[Size];
            for (int i = 0; i < W.Length; i++)
            {
                W[i] = new WORD(this, i * 2);
            }
        }
Beispiel #20
0
        public static void set()
        {
            //イベント登録
            sre.SpeechRecognized += async(object sender, SpeechRecognizedEventArgs e) =>
            {
                if (Busy)
                {
                    return;
                }

                Busy = true;

                try
                {
                    if (e.Result == null)
                    {
                        一致率 = 0;
                        return;
                    }

                    一致率 = e.Result.Confidence * 100;

                    if (一致率 < State.VmTestStatus.VoiceSpec)
                    {
                        return;
                    }

                    foreach (var w in Enum.GetValues(typeof(WORD)))
                    {
                        if (e.Result.Text == ((WORD)w).ToString())
                        {
                            word = (WORD)w;
                        }
                    }

                    switch (word)
                    {
                    case WORD.オッケー:
                    case WORD.カイシ:
                    case WORD.カクニン:
                    case WORD.スタート:
                        Flags.OkPushed = true;
                        break;

                    case WORD.エヌジー:
                    case WORD.キャンセル:
                        Flags.CancelPushed = true;
                        break;

                    default:
                        return;
                    }
                    State.VmTestStatus.音声認識率 = $"{ word.ToString()}  一致率{一致率.ToString("F0")}%";
                    Flags.FlagStopSwCheck    = true;
                }
                finally
                {
                    await Task.Delay(250);

                    State.VmTestStatus.音声認識率 = "";
                    Busy = false;
                }
            };
        }
Beispiel #21
0
 public static bool WriteWORD(IntPtr pOffset, WORD pData)
 {
     if (processHandle == IntPtr.Zero) {
         CheckProcess();
     }
     try {
         return WriteByteArray(pOffset, pData.ToByteArray());
     } catch (Exception e) {
         if (debugMode) {
             Console.WriteLine("Error: WriteWORD: " + e);
         }
         return false;
     }
 }
Beispiel #22
0
        string texName;         //纹理名称


        public void Load(BinaryReader br)
        {
            DWORD temp = br.ReadUInt32();

            char [] lpName  = new char[temp + 1];
            char [] strName = br.ReadChars((int)temp);
            Array.Copy(strName, lpName, temp);
            lpName[temp] = '\0';
            this.name    = lpName.ToString();

            this.dwBlendCount = br.ReadUInt32();
            this.dwNVecCount  = br.ReadUInt32();
            this.dwAVecCount  = br.ReadUInt32();

            int vertexCount = (int)dwNVecCount + (int)dwAVecCount;

            this.vb = new VertexBuffer(Core.Device, vertexCount * VERTERX_SIZE,
                                       Usage.WriteOnly, VertexFormat.None, Pool.Managed);
            this.lpVB = new PhyVertex[vertexCount];
            for (int i = 0; i < vertexCount; i++)
            {
                this.lpVB[i] = new PhyVertex(br);
            }
            DataStream vbs = this.vb.Lock(0, 0, LockFlags.None);

            for (int i = 0; i < vertexCount; i++)
            {
                PhyOutVertex fvf;
                fvf.u     = this.lpVB[i].u;
                fvf.v     = this.lpVB[i].v;
                fvf.color = this.lpVB[i].color;
            }
            vbs.Close();
            this.vb.Unlock();

            this.dwNTriCount = br.ReadUInt32();
            this.dwATriCount = br.ReadUInt32();

            //三角形个数乘以3即是索引个数
            int triCount = (int)this.dwNTriCount + (int)this.dwATriCount;

            this.ib = new IndexBuffer(Core.Device, triCount * 3 * 16, Usage.WriteOnly, Pool.Managed, true);

            DataStream ibs = this.ib.Lock(0, 0, LockFlags.None);

            for (int i = 0; i < triCount * 3; i++)
            {
                WORD idx = br.ReadUInt16();
                ibs.Write <WORD>(idx);
            }
            ibs.Close();
            this.ib.Unlock();

            //纹理路径长度
            int texNameLen = (int)br.ReadUInt32();

            char[] arrTexName = br.ReadChars(texNameLen);
            texName = arrTexName.ToString();

            int sizeBoxMin = Marshal.SizeOf(typeof(Vector3));

            Debug.WriteLine("size:" + sizeBoxMin);

            byte[]   bytesMin = br.ReadBytes(sizeBoxMin);
            GCHandle handle   = GCHandle.Alloc(bytesMin, GCHandleType.Pinned);
            Vector3  bboxMin  = (Vector3)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Vector3));

            handle.Free();
            Debug.WriteLine(bboxMin.ToString());

            byte[]   bytesMax  = br.ReadBytes(Vector3.SizeInBytes);
            GCHandle handleMax = GCHandle.Alloc(bytesMax, GCHandleType.Pinned);
            Vector3  bboxMax   = (Vector3)Marshal.PtrToStructure(handleMax.AddrOfPinnedObject(), typeof(Vector3));

            handleMax.Free();
        }
Beispiel #23
0
 public static byte LOBYTE(WORD w)
 {
     return((BYTE)(((DWORD_PTR)(w)) & 0xff));  // WinDef.h:203
 }
    static void Main(string[] args)
    {
        try {
            string XML = File.ReadAllText(@"lewis.xml");

            List <Entry> DICT = compile(XML);

            foreach (var WORD in DICT)
            {
                WORD.correct();
            }

            Regex[] PATTERNS = Patterns();

            var UNK = new StringBuilder();

            Dictionary <char, StringBuilder> LINES = new Dictionary <char, StringBuilder>();

            foreach (var WORD in DICT)
            {
                Regex found = null;
                foreach (Regex REX in PATTERNS)
                {
                    if (REX.IsMatch(WORD.Declaration))
                    {
                        System.Diagnostics.Debug.Assert(found == null, "Duplicate regular expression pattern detected.");
                        found = REX;
                    }
                }
                if (found != null)
                {
                    char c = char.ToLowerInvariant(WORD.Declaration[0]);
                    if (c == '(')
                    {
                        c = WORD.Declaration[1];
                    }
                    switch (c)
                    {
                    case 'ā':
                        c = 'a';
                        break;

                    case 'ē':
                        c = 'e';
                        break;

                    case 'ō':
                        c = 'o';
                        break;

                    case 'ī':
                        c = 'i';
                        break;

                    case 'ū':
                        c = 'u';
                        break;
                    }
                    c = char.ToUpperInvariant(c);
                    if (!LINES.ContainsKey(c))
                    {
                        LINES[c] = new StringBuilder();
                    }
                    LINES[c].Append($"##### {WORD.Declaration}");
                    if (!string.IsNullOrWhiteSpace(WORD.Definition))
                    {
                        LINES[c].Append($"\r\n{WORD.Definition}");
                    }
                    LINES[c].Append($"\r\n");
                }
                else
                {
                    UNK.Append($"##### {WORD.Declaration}\r\n");
                }
            }

            foreach (var c in LINES)
            {
                if (c.Value != null)
                {
                    File.WriteAllText($"data//{c.Key}.md", c.Value.ToString());
                }
            }

            File.WriteAllText(@"lewis.md", UNK.ToString());
        } catch (Exception e) {
            Console.Error?.WriteLine(e);
        }

        Console.WriteLine("Done.");
    }
Beispiel #25
0
 public static int writeWord(byte[] bytes, int offset, WORD val)
 {
     return(writeUshort(bytes, offset, (ushort)val));
 }
 virtual HRESULT __stdcall Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
     return(E_NOTIMPL);
 }
Beispiel #27
0
            private static FIELD CreateNewField(BinaryReader br, int index, int fieldOffset, int dataOrDataOffset, GffFieldType fieldType)
            {
                FIELD data;

                switch (fieldType)
                {
                case GffFieldType.BYTE:
                    data = new BYTE(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CHAR:
                    data = new CHAR(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.WORD:
                    data = new WORD(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.SHORT:
                    data = new SHORT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DWORD:
                    data = new DWORD(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.INT:
                    data = new INT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DWORD64:
                    data = new DWORD64(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.INT64:
                    data = new INT64(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.FLOAT:
                    data = new FLOAT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DOUBLE:
                    data = new DOUBLE(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CExoString:
                    data = new CExoString(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.ResRef:
                    data = new ResRef(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CExoLocString:
                    data = new CExoLocString(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.VOID:
                    data = new VOID(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Struct:
                    int lbl_index = br.ReadInt32();
                    data = new STRUCT(br, br.ReadInt32(), lbl_index);
                    break;

                case GffFieldType.List:
                    data = new LIST(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Orientation:
                    data = new Orientation(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Vector:
                    data = new Vector(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.StrRef:
                    data = new StrRef(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                default:
                    throw new Exception(string.Format("UNEXPECTED FIELD TYPE \"{0}\", IN STRUCT INDEX \"{1}\"", fieldType, index));
                }

                return(data);
            }
Beispiel #28
0
 public void Reverse_WithWordString_ExpectsReversedWordString()
 => Equal(
     WORD_REVERSED,
     WORD.Reverse());
Beispiel #29
0
 public void writeWord(WORD value, ushort address)
 {
     data[address]     = value.low;
     data[address + 1] = value.high;
 }
Beispiel #30
0
        static void NE_FixupSegmentPrologs(NE_MODULE* pModule, WORD segnum)
        {
            SEGTABLEENTRY* pSegTable = NE_SEG_TABLE(pModule);
            ET_BUNDLE* bundle;
            ET_ENTRY* entry;
            WORD dgroup, num_entries, sel = SEL(pSegTable[segnum - 1].hSeg);
            BYT* pSeg, *pFunc;

            if (pSegTable[segnum - 1].flags & NE_SEGFLAGS_DATA)
            {
                pSegTable[segnum - 1].flags |= NE_SEGFLAGS_LOADED;
                return;
            }

            if (!pModule->ne_autodata) return;

            if (!pSegTable[pModule.ne_autodata - 1].hSeg) return;
            dgroup = SEL(pSegTable[pModule.ne_autodata - 1].hSeg);

            pSeg = MapSL(MAKESEGPTR(sel, 0));

            bundle = (ET_BUNDLE*)((BYTE*)pModule + pModule.ne_enttab);

            do {
                Debug.Print("num_entries: {0}, bundle: {1}, next: {2:X4}, pSeg: {3}", bundle.last - bundle.first, bundle, bundle.next, pSeg);
                if (!(num_entries = bundle.last - bundle.first))
                    return;
                entry = (ET_ENTRY*)((BYTE*)bundle + 6);
                while (num_entries--)
                {
                    /*TRACE("entry: %p, entry.segnum: %d, entry.offs: %04x\n", entry, entry.segnum, entry.offs);*/
                    if (entry.segnum == segnum)
                    {
                        pFunc = pSeg + entry.offs;
                        TRACE("pFunc: %p, *(DWORD *)pFunc: %08x, num_entries: %d\n", pFunc, *(DWORD*)pFunc, num_entries);
                        if (*(pFunc + 2) == 0x90)
                        {
                            if (*(WORD*)pFunc == 0x581e) /* push ds, pop ax */
                            {
                                TRACE("patch %04x:%04x -> mov ax, ds\n", sel, entry.offs);
                                *(WORD*)pFunc = 0xd88c; /* mov ax, ds */
                            }

                            if (*(WORD*)pFunc == 0xd88c)
                            {
                                if ((entry.flags & 2)) /* public data ? */
                                {
                                    TRACE("patch %04x:%04x -> mov ax, dgroup [%04x]\n", sel, entry.offs, dgroup);
                                    *pFunc = 0xb8; /* mov ax, */
                                    *(WORD*)(pFunc + 1) = dgroup;
                                }
                                else if ((pModule.ne_flags & NE_FFLAGS_MULTIPLEDATA)
                                         && (entry.flags & 1)) /* exported ? */
                                {
                                    TRACE("patch %04x:%04x -> nop, nop\n", sel, entry.offs);
                                    *(WORD*)pFunc = 0x9090; /* nop, nop */
                                }
                            }
                        }
                    }
                    entry++;
                }
            } while ((bundle.next) && (bundle = ((ET_BUNDLE*)((BYTE*)pModule + bundle.next))));
        }
Beispiel #31
0
        static void NE_FixupSegmentPrologs(NE_MODULE *pModule, WORD segnum)
        {
            SEGTABLEENTRY *pSegTable = NE_SEG_TABLE(pModule);
            ET_BUNDLE *    bundle;
            ET_ENTRY *     entry;
            WORD           dgroup, num_entries, sel = SEL(pSegTable[segnum - 1].hSeg);
            BYT *          pSeg, *pFunc;


            if (pSegTable[segnum - 1].flags & NE_SEGFLAGS_DATA)
            {
                pSegTable[segnum - 1].flags |= NE_SEGFLAGS_LOADED;
                return;
            }

            if (!pModule->ne_autodata)
            {
                return;
            }


            if (!pSegTable[pModule.ne_autodata - 1].hSeg)
            {
                return;
            }
            dgroup = SEL(pSegTable[pModule.ne_autodata - 1].hSeg);


            pSeg = MapSL(MAKESEGPTR(sel, 0));


            bundle = (ET_BUNDLE *)((BYTE *)pModule + pModule.ne_enttab);


            do
            {
                Debug.Print("num_entries: {0}, bundle: {1}, next: {2:X4}, pSeg: {3}", bundle.last - bundle.first, bundle, bundle.next, pSeg);
                if (!(num_entries = bundle.last - bundle.first))
                {
                    return;
                }
                entry = (ET_ENTRY *)((BYTE *)bundle + 6);
                while (num_entries--)
                {
                    /*TRACE("entry: %p, entry.segnum: %d, entry.offs: %04x\n", entry, entry.segnum, entry.offs);*/
                    if (entry.segnum == segnum)
                    {
                        pFunc = pSeg + entry.offs;
                        TRACE("pFunc: %p, *(DWORD *)pFunc: %08x, num_entries: %d\n", pFunc, *(DWORD *)pFunc, num_entries);
                        if (*(pFunc + 2) == 0x90)
                        {
                            if (*(WORD *)pFunc == 0x581e) /* push ds, pop ax */
                            {
                                TRACE("patch %04x:%04x -> mov ax, ds\n", sel, entry.offs);
                                *(WORD *)pFunc = 0xd88c; /* mov ax, ds */
                            }


                            if (*(WORD *)pFunc == 0xd88c)
                            {
                                if ((entry.flags & 2)) /* public data ? */
                                {
                                    TRACE("patch %04x:%04x -> mov ax, dgroup [%04x]\n", sel, entry.offs, dgroup);
                                    *pFunc = 0xb8; /* mov ax, */
                                    *(WORD *)(pFunc + 1) = dgroup;
                                }
                                else if ((pModule.ne_flags & NE_FFLAGS_MULTIPLEDATA) &&
                                         (entry.flags & 1))    /* exported ? */
                                {
                                    TRACE("patch %04x:%04x -> nop, nop\n", sel, entry.offs);
                                    *(WORD *)pFunc = 0x9090; /* nop, nop */
                                }
                            }
                        }
                    }
                    entry++;
                }
            } while ((bundle.next) && (bundle = ((ET_BUNDLE *)((BYTE *)pModule + bundle.next))));
        }
        protected virtual void FixupILCode(ILBuffer current, OpCode qcode, int argFixOffset, bool hasReturn)
        {
            // ldarg.s -> stloc.s
            // 0xE ~ 0x13
            // + FDFB = long version (remove 's')
            WORD v = qcode.Value;

            if (Range(v, 0xE, 0x13))
            {
                v += 0xFD_FB;
                // fix operand size
                current.operand = (short)(byte)current.operand;
            }

            // (only return buffer, instance)
            if (argFixOffset == 2)
            {
                // ldarg_3
                if (v == 5)
                {
                    v = 0xFE_09; // ldarg
                    current.operand = (short)4;
                }
                // ldarg_1 ldarg_2
                else if (v == 3 || v == 4)
                {
                    v++;
                }
                // ldarg ldarga starg
                else if (Range(v, 0xFE_09, 0xFE_0B))
                {
                    current.operand = (short)((short)current.operand + 1);
                }
            }
            if (hasReturn)
            {
                // ldloc_3
                if (v == 9)
                {
                    v = 0xFE_0C; // ldloc
                    current.operand = (short)4;
                }
                // stloc_3
                else if (v == 0xD)
                {
                    v = 0xFE_0E;
                    current.operand = (short)4;
                }
                // ldloc_0 ldloc_1 ldloc_2 stloc_0 stloc_1 stloc_2
                else if (Range(v, 6, 8) || Range(v, 0xA, 0xD))
                {
                    v++;
                }
                // ldloc ldloca stloc
                else if (Range(v, 0xFE_0C, 0xFE_0E))
                {
                    current.operand = (short)((short)current.operand + 1);
                }
            }

            // br.s -> blt.un.s
            if (Range(v, 0x2B, 0x37))
            {
                v += 0xD;
            }
            else if (v == 0xDE) // leave.s
            {
                v = 0xDD;
            }

            if (v != qcode.Value)
            {
                current.code = OpCodeConverter.GetCode(v.unsigned);
            }
        }