Exemplo n.º 1
0
        public static byte[] EncodeMode10(DecodedMode mode, PeripheralDeviceTypes deviceType)
        {
            int modeSize = 0;

            if (mode.Pages != null)
            {
                modeSize += mode.Pages.Sum(page => page.PageResponse.Length);
            }

            byte[] hdr = EncodeModeHeader10(mode.Header, deviceType);
            modeSize += hdr.Length;
            byte[] md = new byte[modeSize];

            Array.Copy(hdr, 0, md, 0, hdr.Length);

            if (mode.Pages == null)
            {
                return(md);
            }

            {
                int offset = hdr.Length;
                foreach (ModePage page in mode.Pages)
                {
                    Array.Copy(page.PageResponse, 0, md, offset, page.PageResponse.Length);
                    offset += page.PageResponse.Length;
                }
            }

            return(md);
        }
Exemplo n.º 2
0
        public static DecodedMode?DecodeMode10(byte[] modeResponse, PeripheralDeviceTypes deviceType)
        {
            ModeHeader?hdr = DecodeModeHeader10(modeResponse, deviceType);

            if (!hdr.HasValue)
            {
                return(null);
            }

            DecodedMode decoded = new DecodedMode {
                Header = hdr.Value
            };
            bool longlba = (modeResponse[4] & 0x01) == 0x01;
            int  offset;
            int  blkDrLength = 0;

            if (decoded.Header.BlockDescriptors != null)
            {
                blkDrLength = decoded.Header.BlockDescriptors.Length;
            }

            if (longlba)
            {
                offset = 8 + blkDrLength * 16;
            }
            else
            {
                offset = 8 + blkDrLength * 8;
            }
            int length = modeResponse[0] << 8;

            length += modeResponse[1];
            length += 2;

            if (length != modeResponse.Length)
            {
                return(decoded);
            }

            List <ModePage> listpages = new List <ModePage>();

            while (offset < modeResponse.Length)
            {
                bool     isSubpage = (modeResponse[offset] & 0x40) == 0x40;
                ModePage pg        = new ModePage();
                byte     pageNo    = (byte)(modeResponse[offset] & 0x3F);

                if (pageNo == 0)
                {
                    pg.PageResponse = new byte[modeResponse.Length - offset];
                    Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
                    pg.Page    = 0;
                    pg.Subpage = 0;
                    offset    += pg.PageResponse.Length;
                }
                else
                {
                    if (isSubpage)
                    {
                        pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4];

                        if (pg.PageResponse.Length + offset > modeResponse.Length)
                        {
                            return(decoded);
                        }

                        Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
                        pg.Page    = (byte)(modeResponse[offset] & 0x3F);
                        pg.Subpage = modeResponse[offset + 1];
                        offset    += pg.PageResponse.Length;
                    }
                    else
                    {
                        pg.PageResponse = new byte[modeResponse[offset + 1] + 2];

                        if (pg.PageResponse.Length + offset > modeResponse.Length)
                        {
                            return(decoded);
                        }

                        Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
                        pg.Page    = (byte)(modeResponse[offset] & 0x3F);
                        pg.Subpage = 0;
                        offset    += pg.PageResponse.Length;
                    }
                }

                listpages.Add(pg);
            }

            decoded.Pages = listpages.ToArray();

            return(decoded);
        }
Exemplo n.º 3
0
        public static DecodedMode?DecodeMode6(byte[] modeResponse, PeripheralDeviceTypes deviceType)
        {
            ModeHeader?hdr = DecodeModeHeader6(modeResponse, deviceType);

            if (!hdr.HasValue)
            {
                return(null);
            }

            var decoded = new DecodedMode
            {
                Header = hdr.Value
            };

            int blkDrLength = 0;

            if (decoded.Header.BlockDescriptors != null)
            {
                blkDrLength = decoded.Header.BlockDescriptors.Length;
            }

            int offset = 4 + (blkDrLength * 8);
            int length = modeResponse[0] + 1;

            if (length != modeResponse.Length)
            {
                return(decoded);
            }

            List <ModePage> listpages = new List <ModePage>();

            while (offset < modeResponse.Length)
            {
                bool isSubpage = (modeResponse[offset] & 0x40) == 0x40;
                var  pg        = new ModePage();
                byte pageNo    = (byte)(modeResponse[offset] & 0x3F);

                if (pageNo == 0)
                {
                    pg.PageResponse = new byte[modeResponse.Length - offset];
                    Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length);
                    pg.Page    = 0;
                    pg.Subpage = 0;
                    offset    += pg.PageResponse.Length;
                }
                else
                {
                    if (isSubpage)
                    {
                        if (offset + 3 >= modeResponse.Length)
                        {
                            break;
                        }

                        pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4];
                        int copyLen = pg.PageResponse.Length;

                        if (pg.PageResponse.Length + offset > modeResponse.Length)
                        {
                            copyLen = modeResponse.Length - offset;
                        }

                        Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen);
                        pg.Page    = (byte)(modeResponse[offset] & 0x3F);
                        pg.Subpage = modeResponse[offset + 1];
                        offset    += pg.PageResponse.Length;
                    }
                    else
                    {
                        if (offset + 1 >= modeResponse.Length)
                        {
                            break;
                        }

                        pg.PageResponse = new byte[modeResponse[offset + 1] + 2];
                        int copyLen = pg.PageResponse.Length;

                        if (pg.PageResponse.Length + offset > modeResponse.Length)
                        {
                            copyLen = modeResponse.Length - offset;
                        }

                        Array.Copy(modeResponse, offset, pg.PageResponse, 0, copyLen);
                        pg.Page    = (byte)(modeResponse[offset] & 0x3F);
                        pg.Subpage = 0;
                        offset    += pg.PageResponse.Length;
                    }
                }

                listpages.Add(pg);
            }

            decoded.Pages = listpages.ToArray();

            return(decoded);
        }