Madhu C. Reddy

115 papers A* 15A 15B 9Misc 17Journal 40Unranked 17
YearRankTypeTitle / Venue / Authors
2025 A* conf
CHI
Novia Wong, Nai-Yu Cheng, Bruna Oewel, Katherine E. Genuario, SarahElizabeth Stoeckl, Stephen M. Schueller, Iftekhar Ahmed, André van der Hoek, Madhu C. Reddy
2025 conf
CHI Extended Abstracts
Sachin R. Pendse, Novia Wong, Munmun De Choudhury, Jaydon Farao, Neha Kumar, Nasalifya Namwinga, Giovanni Ramos, Asra Sakeen Wani, Jessica Lee Schleider, Madhu C. Reddy
2025 A* conf
CHI
Justine Rose Bautista, Novia Wong, Madhu C. Reddy, Stephen M. Schueller
2025 A* conf
CHI
Nai-Yu Cheng, Novia Wong, Madhu C. Reddy
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Jiayu Yuki Yin, Novia Wong, Madhu C. Reddy
2025 A* conf
CHI
Eleanor R. Burgess, Sean A. Munson, David C. Mohr, Madhu C. Reddy
2024 J jnl
CoRR
Rachael Zehrung, Madhu C. Reddy, Yunan Chen
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Rachael Zehrung, Madhu C. Reddy, Yunan Chen
2024 A conf
Conference on Designing Interactive Systems
Novia Wong, Sooyeon Jeong, Madhu C. Reddy, Caitlin A. Stamatis, Emily G. Lattie, Maia L. Jacobs
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Rachel Kornfield, Emily G. Lattie, Jennifer Nicholas, Ashley A. Knapp, David C. Mohr, Madhu C. Reddy
2023 J jnl
Frontiers Digit. Health
Ashley A. Knapp, Emily Hersch, Clarisa Wijaya, Miguel A. Herrera, Kaylee Payne Kruzan, Allison J. Carroll, Sydney Lee, Alex Baker, Alanna Gray, Vann Harris, Robert Simmons, Deepika Kour Sodhi, Nanette Hannah, Madhu C. Reddy, Niranjan S. Karnik, Justin D. Smith, C. Hendricks Brown, David C. Mohr
2023 conf
CHI Extended Abstracts
Aaron Lyon, Sean A. Munson, Madhu C. Reddy, Stephen M. Schueller, Elena Agapie, Svetlana Yarosh, Alex Dopp, Ulrica von Thiele Schwarz, Gavin Doherty, Andrea K. Graham, Kaylee Payne Kruzan, Rachel Kornfield
2023 A* conf
CHI
Novia Wong, Victoria Jackson, André van der Hoek, Iftekhar Ahmed, Stephen M. Schueller, Madhu C. Reddy
2023 A* conf
CHI
Kaylee Payne Kruzan, Ada Ng, Colleen Stiles-Shields, Emily G. Lattie, David C. Mohr, Madhu C. Reddy
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Eleanor R. Burgess, Madhu C. Reddy, David C. Mohr
2022 A* conf
CHI
Kaylee Payne Kruzan, Jonah Meyerhoff, Theresa Nguyen, Madhu C. Reddy, David C. Mohr, Rachel Kornfield
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Shefali Haldar, Hannah Studd, Novia Wong, David C. Mohr, Madhu C. Reddy, Emily S. Miller
2022 J jnl
Frontiers Digit. Health
Kaylee Payne Kruzan, David C. Mohr, Madhu C. Reddy
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Rachel Kornfield, David C. Mohr, Rachel Ranney, Emily G. Lattie, Jonah Meyerhoff, Joseph Jay Williams, Madhu C. Reddy
2022 A* conf
CHI
Rachel Kornfield, Jonah Meyerhoff, Hannah Studd, Ananya Bhattacharjee, Joseph Jay Williams, Madhu C. Reddy, David C. Mohr
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Jonah Meyerhoff, Rachel Kornfield, David C. Mohr, Madhu C. Reddy
2022 A conf
Conference on Designing Interactive Systems
Ada Ng, Ashley Marie Walker, Laurie Wakschlag, Nabil Alshurafa, Madhu C. Reddy
2021 J jnl
Comput. Support. Cooperative Work.
Emily G. Lattie, Eleanor R. Burgess, David C. Mohr, Madhu C. Reddy
2021 A* conf
CHI
Renwen Zhang, Kathryn E. Ringland, Melina Paan, David C. Mohr, Madhu C. Reddy
2021 A* conf
CHI
Renwen Zhang, Natalya N. Bazarova, Madhu C. Reddy
2021 J jnl
J. Am. Medical Informatics Assoc.
Jessica S. Ancker, Natalie C. Benda, Madhu C. Reddy, Kim M. Unertl, Tiffany C. Veinot
2021 J jnl
Interactions
Eleanor R. Burgess, Renwen Zhang, Sindhu Kiranmai Ernala, Jessica L. Feuston, Munmun De Choudhury, Mary Czerwinski, Adrián Aguilera, Stephen M. Schueller, Madhu C. Reddy
2020 A* conf
CHI
Rachel Kornfield, Renwen Zhang, Jennifer Nicholas, Stephen M. Schueller, Scott Allen Cambo, David C. Mohr, Madhu C. Reddy
2020 A* conf
CHI
Emily G. Lattie, Rachel Kornfield, Kathryn E. Ringland, Renwen Zhang, Nathan Winquist, Madhu C. Reddy
2020 A* conf
CHI
Jordan Eschler, Eleanor R. Burgess, Madhu C. Reddy, David C. Mohr
2020 conf
CHI Extended Abstracts
Eleanor R. Burgess, Alice Renwen Zhang, Jessica L. Feuston, Madhu C. Reddy, Sindhu Kiranmai Ernala, Munmun De Choudhury, Stephen M. Schueller, Adrián Aguilera, Mary Czerwinski
2020 conf
ASIST
Chi Young Oh, Rachel Kornfield, Emily G. Lattie, David C. Mohr, Madhu C. Reddy
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Eleanor R. Burgess, Kathryn E. Ringland, Jennifer Nicholas, Ashley A. Knapp, Jordan Eschler, David C. Mohr, Madhu C. Reddy
2019 A* conf
CHI
Eleanor R. Burgess, Madhu C. Reddy, Andrew Davenport, Paul Laboi, Ann Blandford
2019 conf
CSCW Companion
Ashley Marie Walker, Michael A. DeVito, Kathryn E. Ringland, Madhu C. Reddy
2019 Misc conf
AMIA
Robert S. Rudin, Cynthia LeRouge, Danielle C. Lavallee, Madhu C. Reddy, Anuj K. Dalal
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Ada Ng, Rachel Kornfield, Stephen M. Schueller, Alyson K. Zalta, Michael Brennan, Madhu C. Reddy
2019 A conf
ASSETS
Kathryn E. Ringland, Jennifer Nicholas, Rachel Kornfield, Emily G. Lattie, David C. Mohr, Madhu C. Reddy
2018 J jnl
Comput. Support. Cooperative Work.
Renwen Zhang, Jordan Eschler, Madhu C. Reddy
2017 A* conf
CHI
Elizabeth V. Eikey, Madhu C. Reddy
2017 A conf
CSCW
Alison R. Murphy, Madhu C. Reddy
2017 J jnl
Int. J. Medical Informatics
Alison R. Murphy, Madhu C. Reddy
2017 conf
HICSS
Yanjun Gao, Madhu C. Reddy, Bernard J. Jansen
2017 J jnl
J. Assoc. Inf. Sci. Technol.
Nathan J. McNeese, Madhu C. Reddy
2016 Misc conf
AMIA
Preethi Srinivas, Madhu C. Reddy, Anthony Faiola
2016 Misc conf
AMIA
Lena Mamykina, Madhu C. Reddy, Katie A. Siek, Gabriela Marcu, Leslie S. Liu
2016 Misc conf
AMIA
Haining Zhu, Joanna Colgan, Madhu C. Reddy, Eun Kyoung Choe
2016 conf
CHI Extended Abstracts
Yanjun Gao, Madhu C. Reddy, Bernard J. Jansen
2016 A conf
CSCW
Gabriela Marcu, Sara B. Kiesler, Anind K. Dey, Madhu C. Reddy
2016 conf
CHI Extended Abstracts
Lena Mamykina, Madhu C. Reddy, Katie A. Siek, Gabriela Marcu, Leslie S. Liu
2015 Misc conf
AMIA
Craig E. Kuziemsky, Madhu C. Reddy, Katie A. Siek, Sarah A. Collins
2015 J jnl
Int. J. Medical Informatics
Elizabeth V. Eikey, Alison R. Murphy, Madhu C. Reddy, Heng Xu
2015 J jnl
J. Biomed. Informatics
Elizabeth V. Eikey, Madhu C. Reddy, Craig E. Kuziemsky
2014 A conf
Conference on Designing Interactive Systems
Tamara Peyton, Erika Shehan Poole, Madhu C. Reddy, Jennifer Kraschnewski, Cynthia Chuang
2014 Misc conf
AMIA
Bryan D. Steitz, Erika S. Poole, Madhu C. Reddy
2014 A ed.
CSCW
Susan R. Fussell, Wayne G. Lutters, Meredith Ringel Morris, Madhu C. Reddy
2014 ed.
CSCW Companion
Susan R. Fussell, Wayne G. Lutters, Meredith Ringel Morris, Madhu C. Reddy
2014 A conf
Conference on Designing Interactive Systems
Alison R. Murphy, Madhu C. Reddy, Nathan J. McNeese
2014 Misc conf
AMIA
Alison R. Murphy, Madhu C. Reddy
2014 conf
CSCW Companion
Tamara Peyton, Erika Shehan Poole, Madhu C. Reddy, Jennifer Kraschnewski, Cynthia Chuang
2014 A conf
CSCW
Alison R. Murphy, Madhu C. Reddy, Heng Xu
2013 Misc conf
AMIA
Nicholas Johnson, Alison R. Murphy, Nathan J. McNeese, Madhu C. Reddy, Sandeep Purao
2013 J jnl
Comput. Support. Cooperative Work.
Helena M. Mentis, Madhu C. Reddy, Mary Beth Rosson
2013 A conf
CSCW
Joanna Abraham, Madhu C. Reddy
2013 Misc conf
AMIA
Laurie L. Novak, Jos Aarts, Geraldine Fitzpatrick, Paul N. Gorman, Madhu C. Reddy
2013 J jnl
J. Assoc. Inf. Sci. Technol.
Arvind Karunakaran, Madhu C. Reddy, Patricia Ruma Spence
2012 A conf
ER
Sandeep Purao, Wolfgang Maass, Veda C. Storey, Bernard J. Jansen, Madhu C. Reddy
2012 conf
ASIST
Arvind Karunakaran, Madhu C. Reddy
2012 J jnl
Comput. Support. Cooperative Work.
Patricia Ruma Spence, Madhu C. Reddy
2012 conf
ASIST
Patricia Ruma Spence, Madhu C. Reddy
2012 J jnl
Interactions
Madhu C. Reddy, Lena Mamykina, Andrea Grimes Parker
2012 conf
CSCW (Companion)
m. c. schraefel, Wendy A. Kellogg, Mark S. Ackerman, Gary Marsden, Susanne Bødker, Susan Wyche, Madhu C. Reddy, Mark Rouncefield
2012 conf
IHI
Arvind Karunakaran, Young Hee-Nam, Madhu C. Reddy
2012 J jnl
Found. Trends Hum. Comput. Interact.
Monica Tentori, Gillian R. Hayes, Madhu C. Reddy
2012 B conf
GROUP
Arvind Karunakaran, Madhu C. Reddy
2011 J jnl
J. Assoc. Inf. Syst.
Fay Cobb Payton, Guy Paré, Cynthia M. Le Rouge, Madhu C. Reddy
2011 conf
CHI Extended Abstracts
Helena M. Mentis, Harold W. Thimbleby, Julie A. Kientz, Gillian R. Hayes, Madhu C. Reddy
2011 J jnl
Int. J. Medical Informatics
Madhu C. Reddy, Paul N. Gorman, Jakob E. Bardram
2011 B conf
ECSCW
Troels Mønsted, Madhu C. Reddy, Jørgen P. Bansler
2010 J jnl
Simul.
Sharoda A. Paul, Madhu C. Reddy, Christopher DeFlitch
2010 J jnl
Int. J. Medical Informatics
Joanna Abraham, Madhu C. Reddy
2010 B conf
GROUP
Chirag Shah, Madhu C. Reddy, Michael B. Twidale
2010 A conf
CSCW
Helena M. Mentis, Madhu C. Reddy, Mary Beth Rosson
2010 B ed.
GROUP
Wayne G. Lutters, Diane H. Sonnenwald, Tom Gross, Madhu C. Reddy
2010 A conf
CSCW
Sharoda A. Paul, Madhu C. Reddy
2009 J jnl
Int. J. Medical Informatics
Madhu C. Reddy, Sharoda A. Paul, Joanna Abraham, Michael D. McNeese, Christopher DeFlitch, John Yen
2009 Misc conf
AMIA
Shizhuo Zhu, Madhu C. Reddy, John Yen
2009 J jnl
CoRR
Madhu C. Reddy, Bernard J. Jansen
2009 Misc conf
AMIA
Joanna Abraham, Thomas George Kannampallil, Madhu C. Reddy
2009 B conf
GROUP
Andreas F. Phelps, Madhu C. Reddy
2008 J jnl
Inf. Process. Manag.
Madhu C. Reddy, Bernard J. Jansen
2008 J jnl
J. Am. Medical Informatics Assoc.
Madhu C. Reddy, Sandeep Purao, Mary Kelly
2008 J jnl
Inf. Process. Manag.
Madhu C. Reddy, Patricia Ruma Spence
2008 J jnl
J. Biomed. Informatics
Madhu C. Reddy, M. Michael Shabot, Erin Bradner
2008 conf
CHI Extended Abstracts
Sharoda A. Paul, Madhu C. Reddy, Christopher DeFlitch
2008 A conf
CSCW
Joanna Abraham, Madhu C. Reddy
2008 ch.
Theory in CSCW
Madhu C. Reddy, Paul Dourish
2008 Misc conf
AMIA
Sharoda A. Paul, Madhu C. Reddy, Joanna Abraham, Christopher DeFlitch
2008 conf
ASIST
Madhu C. Reddy, Bernard J. Jansen, Rashmi Krishnappa
2007 J jnl
Int. J. Medical Informatics
Mike W. Chiasson, Madhu C. Reddy, Bonnie Kaplan, Elizabeth J. Davidson
2007 J jnl
Inf. Process. Manag.
Madhu C. Reddy, Joanna Abraham
2007 B conf
AIME
Shizhuo Zhu, Joanna Abraham, Sharoda A. Paul, Madhu C. Reddy, John Yen, Mark S. Pfaff, Christopher DeFlitch
2007 B conf
GROUP
Patricia Ruma Spence, Madhu C. Reddy
2006 Misc conf
AMIA
Madhu C. Reddy, Patricia Ruma Spence
2006 J jnl
Comput. Support. Cooperative Work.
Madhu C. Reddy, Paul Dourish, Wanda Pratt
2005 B conf
GROUP
Patricia Ruma Spence, Madhu C. Reddy, Richard Hall
2005 J jnl
J. Biomed. Informatics
Madhu C. Reddy, David W. McDonald, Wanda Pratt, M. Michael Shabot
2004 J jnl
J. Biomed. Informatics
Wanda Pratt, Madhu C. Reddy, David W. McDonald, Peter Tarczy-Hornoch, John H. Gennari
2003 Misc conf
AMIA
Madhu C. Reddy, Wanda Pratt, David W. McDonald, M. Michael Shabot
2002 A conf
CSCW
Madhu C. Reddy, Paul Dourish
2002 Misc conf
AMIA
Madhu C. Reddy, Wanda Pratt, Paul Dourish, M. Michael Shabot
2001 B conf
ECSCW
Madhu C. Reddy, Paul Dourish, Wanda Pratt
2000 Misc conf
AMIA
Madhu C. Reddy, Chad Seeraty, Tai-Wei Lin, Wanda Pratt
2000 Misc conf
AMIA
John H. Gennari, Madhu C. Reddy
1992 conf
SIGMOD Conference
Craig Harris, Madhu C. Reddy, Carl Woolf
redb/extractors/elf_extractors/elf_notes.py
← Index redb/extractors/elf_extractors/elf_notes.py python
import inspect
import binascii
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFNote


class ELFNotesExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_notes = []
        self.elastic_index = self.index_prefix + "-elf_notes"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _get_note_type_string(self, note_type: int, note_name: str) -> str:
        """Convert note type number to human-readable string."""

        # GNU-specific note types
        if note_name == "GNU":
            gnu_types = {
                1: "NT_GNU_ABI_TAG",
                2: "NT_GNU_HWCAP",
                3: "NT_GNU_BUILD_ID",
                4: "NT_GNU_GOLD_VERSION",
                5: "NT_GNU_PROPERTY_TYPE_0"
            }
            return gnu_types.get(note_type, f"NT_GNU_UNKNOWN_{note_type}")

        # Generic note types
        generic_types = {
            1: "NT_PRSTATUS",
            2: "NT_FPREGSET",
            3: "NT_PRPSINFO",
            4: "NT_TASKSTRUCT",
            5: "NT_AUXV",
            6: "NT_PSTATUS",
            7: "NT_FPREGS",
            8: "NT_PSINFO",
            9: "NT_PRCRED",
            10: "NT_UTSNAME",
            11: "NT_LWPSTATUS",
            12: "NT_LWPSINFO",
            13: "NT_PRFPXREG"
        }

        return generic_types.get(note_type, f"NT_UNKNOWN_{note_type}")

    def _format_note_description(self, note_desc, note_type: int, note_name: str) -> str:
        """Format note description based on type for human readability."""
        try:
            if not note_desc:
                return ""

            # Handle build ID specifically (common case)
            if note_name == "GNU" and note_type == 3:  # NT_GNU_BUILD_ID
                if isinstance(note_desc, bytes):
                    return binascii.hexlify(note_desc).decode('ascii')
                return str(note_desc)

            # Handle ABI tag
            if note_name == "GNU" and note_type == 1:  # NT_GNU_ABI_TAG
                if isinstance(note_desc, bytes) and len(note_desc) >= 16:
                    # ABI tag contains OS, major, minor, subminor
                    import struct
                    try:
                        os_val, major, minor, subminor = struct.unpack('<IIII', note_desc[:16])
                        os_names = {0: "Linux", 1: "GNU", 2: "Solaris", 3: "FreeBSD"}
                        os_name = os_names.get(os_val, f"OS_{os_val}")
                        return f"{os_name} {major}.{minor}.{subminor}"
                    except:
                        pass

            # For binary data, convert to hex
            if isinstance(note_desc, bytes):
                # Limit size for very large descriptions
                if len(note_desc) > 256:
                    return binascii.hexlify(note_desc[:256]).decode('ascii') + "..."
                return binascii.hexlify(note_desc).decode('ascii')

            # For string data
            if isinstance(note_desc, str):
                return note_desc

            # Fallback
            return str(note_desc)

        except Exception as e:
            self.log.error(f"Error formatting note description: {e}")
            return str(note_desc) if note_desc else ""

    def _extract_note_data(self, note, section_name: str) -> ELFNote:
        """Extract data from a single note entry."""
        try:
            # Get note properties
            note_name = note.get('n_name', '').rstrip('\x00') if note.get('n_name') else ""
            note_type_raw = note.get('n_type', 0)
            note_desc_raw = note.get('n_desc', b'')

            # Handle note_type - pyelftools may return string or int
            if isinstance(note_type_raw, str):
                # pyelftools returned the type as a string like 'NT_GNU_BUILD_ID'
                note_type_str = note_type_raw
                # Map known string types to integers
                note_type_map = {
                    'NT_GNU_ABI_TAG': 1,
                    'NT_GNU_HWCAP': 2,
                    'NT_GNU_BUILD_ID': 3,
                    'NT_GNU_GOLD_VERSION': 4,
                    'NT_GNU_PROPERTY_TYPE_0': 5,
                    'NT_PRSTATUS': 1,
                    'NT_FPREGSET': 2,
                    'NT_PRPSINFO': 3,
                    'NT_TASKSTRUCT': 4,
                    'NT_AUXV': 5,
                    'NT_PSTATUS': 6,
                    'NT_FPREGS': 7,
                    'NT_PSINFO': 8,
                    'NT_PRCRED': 9,
                    'NT_UTSNAME': 10,
                    'NT_LWPSTATUS': 11,
                    'NT_LWPSINFO': 12,
                    'NT_PRFPXREG': 13,
                }
                note_type = note_type_map.get(note_type_raw, 0)
            else:
                note_type = note_type_raw
                # Get human-readable type string
                note_type_str = self._get_note_type_string(note_type, note_name)

            # Format description
            note_desc = self._format_note_description(note_desc_raw, note_type, note_name)

            return ELFNote(
                note_name=note_name,
                note_type=note_type,
                note_type_str=note_type_str,
                note_desc=note_desc,
                note_section=section_name
            )

        except Exception as e:
            self.log.error(f"Error extracting note data: {e}")
            return None

    def _extract_notes_from_sections(self, elf) -> List[Dict]:
        """Extract notes from note sections."""
        notes = []

        try:
            # Look for note sections
            for section in elf.iter_sections():
                if (section.name and
                    section.name.startswith('.note') and
                    hasattr(section, 'iter_notes')):

                    section_name = section.name
                    try:
                        for note in section.iter_notes():
                            note_data = self._extract_note_data(note, section_name)
                            if note_data:
                                notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in section {section_name}: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from sections: {e}")

        return notes

    def _extract_notes_from_segments(self, elf) -> List[Dict]:
        """Extract notes from PT_NOTE segments."""
        notes = []

        try:
            # Look for PT_NOTE segments
            for segment in elf.iter_segments():
                if segment.header.get('p_type') == 'PT_NOTE':
                    segment_name = f"PT_NOTE_segment_{segment.header.get('p_offset', 0)}"

                    try:
                        if hasattr(segment, 'iter_notes'):
                            for note in segment.iter_notes():
                                note_data = self._extract_note_data(note, segment_name)
                                if note_data:
                                    notes.append(note_data)
                    except Exception as e:
                        self.log.debug(f"Could not process notes in segment: {e}")

        except Exception as e:
            self.log.error(f"Error extracting notes from segments: {e}")

        return notes

    def tag(self):
        return Tag.ELF_NOTES.value if hasattr(Tag, 'ELF_NOTES') else "elf_notes"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                all_notes = []

                # Extract notes from note sections
                section_notes = self._extract_notes_from_sections(elf)
                all_notes.extend(section_notes)

                # Extract notes from PT_NOTE segments
                segment_notes = self._extract_notes_from_segments(elf)
                all_notes.extend(segment_notes)

                # Remove duplicates (same note might appear in section and segment)
                unique_notes = []
                seen_notes = set()
                for note in all_notes:
                    note_key = (note.note_name, note.note_type, note.note_desc)
                    if note_key not in seen_notes:
                        seen_notes.add(note_key)
                        unique_notes.append(note)

                return unique_notes

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_notes = result
            return self.elf_notes

        except Exception as e:
            self.log.error(f"Error extracting ELF notes {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_notes
        elif exporter_type == "ClickHouseExporter":
            try:
                # Return valid empty structure if no notes found
                # None is reserved for actual errors

                # Prepare data arrays for all notes
                data = []
                current_time = datetime.now(timezone.utc)
                for note in self.elf_notes:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        note.note_name,
                        note.note_type,
                        note.note_type_str,
                        note.note_desc,
                        note.note_section,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'note_name', 'note_type', 'note_type_str',
                    'note_desc', 'note_section',
                    'analysis_date'
                ]

                if not data:
                    return None

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)', 'UInt32', 'LowCardinality(String)',
                    'String CODEC(ZSTD(3))', 'LowCardinality(String)',
                    'DateTime64(3, \'UTC\')'
                ]

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

    def get_clickhouse_table(self) -> str:
        return "redb_elf_notes"