[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[hardware detection] I wrote a toy for you to play with.



 I found some documentation that taught me to do this... I've got
 copies if you like.  (ps.gz) I found them on one of Red Hat's sites
 several years ago and saved them.

#include <stdio.h>
#include <unistd.h>

#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0

struct option_rom_header {
  unsigned char sig1;		/* Signature byte 1 */
  unsigned char sig2;		/* Signature byte 2 */
  unsigned char len;		/* Option ROM length in 512-byte blocks */
  void *entry;			/* Initialization entry point */
  unsigned char reserved[17];
  unsigned int pci_data_offset;
  unsigned int expansion_header_struct_offset;
};

int
main (int argc, char ** argv)
{
  FILE *kcore;
  int  status;
  size_t n;
  struct option_rom_header hdr;
  long int where;
    
  if ((kcore = fopen ("/proc/kcore", "r")) == (FILE*)NULL) {
    perror ("fopen /proc/kcore");
    exit (EXIT_FAILURE);
  }

  for (where = 0xC0000; where <= 0xEFFFF; where += 0x0800) {

    if ((status = fseek (kcore, where, SEEK_SET)) != 0) {
      perror ("fseek");
      exit (EXIT_FAILURE);
    }

    if ((n = fread (&hdr, sizeof hdr, (size_t)1, kcore)) != 1) {
      perror ("fread");
      exit (EXIT_FAILURE);
    }

    if ((hdr.sig1 == 0x55) && (hdr.sig2 == 0xAA)) {
      printf ("%p: %i blocks @ %p\n", where, hdr.len, hdr.entry);
    }

  }

  if ((status = fclose (kcore)) != 0) {
    perror ("fclose /proc/kcore");
    exit (EXIT_FAILURE);
  }

  exit (EXIT_SUCCESS);
  
}
-- 
mailto: Karl M. Hegbloom <karlheg@debian.org>
http://people.debian.org/~karlheg/

Reply to: