private bool ReadUserInfo()
        {
            int numUser     = 0;
            int numTemplate = 0;

            Cursor.Current = Cursors.WaitCursor;

            int result = BSSDK.BS_GetUserDBInfo(m_Handle, ref numUser, ref numTemplate);

            Cursor.Current = Cursors.Default;

            if (result != BSSDK.BS_SUCCESS)
            {
                MessageBox.Show("Cannot get user DB info", "Error");
                return(false);
            }

            numOfUser.Text     = numUser.ToString();
            numOfTemplate.Text = numTemplate.ToString();

            m_NumOfUser = numUser;

            if (m_DeviceType == BSSDK.BS_DEVICE_BEPLUS || m_DeviceType == BSSDK.BS_DEVICE_BIOLITE)
            {
                BSSDK.BEUserHdr[] userHdr = new BSSDK.BEUserHdr[m_NumOfUser];

                IntPtr userInfo = Marshal.AllocHGlobal(m_NumOfUser * Marshal.SizeOf(typeof(BSSDK.BEUserHdr)));

                Cursor.Current = Cursors.WaitCursor;

                result = BSSDK.BS_GetAllUserInfoBEPlus(m_Handle, userInfo, ref m_NumOfUser);

                Cursor.Current = Cursors.Default;

                if (result != BSSDK.BS_SUCCESS && result != BSSDK.BS_ERR_NOT_FOUND)
                {
                    Marshal.FreeHGlobal(userInfo);

                    MessageBox.Show("Cannot get user header info", "Error");
                    return(false);
                }

                userList.Items.Clear();

                for (int i = 0; i < m_NumOfUser; i++)
                {
                    userHdr[i] = (BSSDK.BEUserHdr)Marshal.PtrToStructure(new IntPtr(userInfo.ToInt32() + i * Marshal.SizeOf(typeof(BSSDK.BEUserHdr))), typeof(BSSDK.BEUserHdr));

                    ListViewItem userItem = userList.Items.Add(userHdr[i].userID.ToString());
                    userItem.SubItems.Add(userHdr[i].numOfFinger.ToString());
                    userItem.SubItems.Add(userHdr[i].cardID.ToString("X"));
                }

                Marshal.FreeHGlobal(userInfo);
            }
            else if (m_DeviceType == BSSDK.BS_DEVICE_BIOSTATION)
            {
                BSSDK.BSUserHdrEx[] userHdr = new BSSDK.BSUserHdrEx[m_NumOfUser];

                IntPtr userInfo = Marshal.AllocHGlobal(m_NumOfUser * Marshal.SizeOf(typeof(BSSDK.BSUserHdrEx)));

                Cursor.Current = Cursors.WaitCursor;

                result = BSSDK.BS_GetAllUserInfoEx(m_Handle, userInfo, ref m_NumOfUser);

                Cursor.Current = Cursors.Default;

                if (result != BSSDK.BS_SUCCESS && result != BSSDK.BS_ERR_NOT_FOUND)
                {
                    Marshal.FreeHGlobal(userInfo);

                    MessageBox.Show("Cannot get user header info", "Error");
                    return(false);
                }

                userList.Items.Clear();

                for (int i = 0; i < m_NumOfUser; i++)
                {
                    userHdr[i] = (BSSDK.BSUserHdrEx)Marshal.PtrToStructure(new IntPtr(userInfo.ToInt32() + i * Marshal.SizeOf(typeof(BSSDK.BSUserHdrEx))), typeof(BSSDK.BSUserHdrEx));

                    ListViewItem userItem = userList.Items.Add(userHdr[i].ID.ToString());
                    userItem.SubItems.Add(userHdr[i].numOfFinger.ToString());
                    userItem.SubItems.Add(userHdr[i].cardID.ToString("X"));
                }

                Marshal.FreeHGlobal(userInfo);
            }

            if (m_NumOfUser > 0)
            {
                try
                {
                    uint ID = UInt32.Parse(userList.Items[0].Text);

                    ReadUser(ID);
                }
                catch (Exception)
                {
                }
            }

            return(true);
        }