summaryrefslogtreecommitdiffstats
path: root/src/file_lnk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/file_lnk.c')
-rw-r--r--src/file_lnk.c262
1 files changed, 130 insertions, 132 deletions
diff --git a/src/file_lnk.c b/src/file_lnk.c
index 542be84..a5c698e 100644
--- a/src/file_lnk.c
+++ b/src/file_lnk.c
@@ -47,11 +47,6 @@ const file_hint_t file_hint_lnk= {
.register_header_check=&register_header_check_lnk
};
-static const unsigned char lnk_header[20]= {
- 'L', 0x00, 0x00, 0x00, /* magic */
- 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 /* GUID */
- };
static const unsigned char lnk_reserved[10]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
@@ -83,156 +78,159 @@ struct lnk_header_s {
#define SCF_COMPONENT 0x1000
/* */
-static void register_header_check_lnk(file_stat_t *file_stat)
-{
- register_header_check(0, lnk_header,sizeof(lnk_header), &header_check_lnk, file_stat);
-}
static int header_check_lnk(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new)
{
- if(memcmp(buffer, lnk_header, sizeof(lnk_header))==0 &&
- memcmp(&buffer[0x42], lnk_reserved, sizeof(lnk_reserved))==0)
- {
- const struct lnk_header_s* lnk_head=(const struct lnk_header_s*)buffer;
- const uint32_t flags=le32(lnk_head->flags);
- unsigned int i=0x4c; /* .LNK File Header */
- unsigned int len;
- if((flags&SCF_PIDL)!=0)
- { /* The Shell Item Id List */
- len=buffer[i]+(buffer[i+1]<<8);
+ const struct lnk_header_s* lnk_head=(const struct lnk_header_s*)buffer;
+ const uint32_t flags=le32(lnk_head->flags);
+ unsigned int i=0x4c; /* .LNK File Header */
+ unsigned int len;
+ if(memcmp(&buffer[0x42], lnk_reserved, sizeof(lnk_reserved))!=0)
+ return 0;
+ if((flags&SCF_PIDL)!=0)
+ { /* The Shell Item Id List */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Shell Item Id List at 0x%04x=%04x\n",
- i, len);
+ log_debug("LNK Shell Item Id List at 0x%04x=%04x\n",
+ i, len);
#endif
- i+=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+4>=buffer_size)
- return 0;
- if((flags&SCF_LOCATION)!=0)
- { /* File location info */
- len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24);
+ i+=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+4>=buffer_size)
+ return 0;
+ if((flags&SCF_LOCATION)!=0)
+ { /* File location info */
+ len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24);
#ifdef DEBUG_LNK
- log_debug("LNK File location info at 0x%04x=%04x\n", i, len);
+ log_debug("LNK File location info at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_DESCRIPTION)!=0)
- { /* Description string */
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_DESCRIPTION)!=0)
+ { /* Description string */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK description string at 0x%04x=%04x\n", i, len);
+ log_debug("LNK description string at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- if((flags& SCF_UNICODE)!=0)
- len*=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_RELATIVE)!=0)
- { /* Relative path */
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ if((flags& SCF_UNICODE)!=0)
+ len*=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_RELATIVE)!=0)
+ { /* Relative path */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK relative path at 0x%04x=%04x\n", i, len);
+ log_debug("LNK relative path at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- if((flags& SCF_UNICODE)!=0)
- len*=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_WORKDIR)!=0)
- { /* Working directory */
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ if((flags& SCF_UNICODE)!=0)
+ len*=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_WORKDIR)!=0)
+ { /* Working directory */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Working directory at 0x%04x=%04x\n", i, len);
+ log_debug("LNK Working directory at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- if((flags& SCF_UNICODE)!=0)
- len*=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_ARGS)!=0)
- { /* Command line string */
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ if((flags& SCF_UNICODE)!=0)
+ len*=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_ARGS)!=0)
+ { /* Command line string */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Command line string at 0x%04x=%04x\n", i, len);
+ log_debug("LNK Command line string at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- if((flags& SCF_UNICODE)!=0)
- len*=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_CUSTOMICON)!=0)
- { /* Icon filename string */
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ if((flags& SCF_UNICODE)!=0)
+ len*=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_CUSTOMICON)!=0)
+ { /* Icon filename string */
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Icon filename string at 0x%04x=%04x\n", i, len);
+ log_debug("LNK Icon filename string at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- if((flags& SCF_UNICODE)!=0)
- len*=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_PRODUCT)!=0)
- {
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ if((flags& SCF_UNICODE)!=0)
+ len*=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_PRODUCT)!=0)
+ {
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Icon product at 0x%04x=%04x\n", i, len);
+ log_debug("LNK Icon product at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+2>=buffer_size)
- return 0;
- if((flags&SCF_COMPONENT)!=0)
- {
- len=buffer[i]+(buffer[i+1]<<8);
+ i+=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+2>=buffer_size)
+ return 0;
+ if((flags&SCF_COMPONENT)!=0)
+ {
+ len=buffer[i]+(buffer[i+1]<<8);
#ifdef DEBUG_LNK
- log_debug("LNK Icon component at 0x%04x=%04x\n", i, len);
+ log_debug("LNK Icon component at 0x%04x=%04x\n", i, len);
#endif
- i+=2;
- i+=len;
- }
- /* avoid out of bound read access */
- if(i+4>=buffer_size)
- return 0;
- /* Extra stuff */
- len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24);
+ i+=2;
+ i+=len;
+ }
+ /* avoid out of bound read access */
+ if(i+4>=buffer_size)
+ return 0;
+ /* Extra stuff */
+ len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24);
#ifdef DEBUG_LNK
- log_debug("LNK extra stuff at 0x%04x=%04x\n", i, len);
+ log_debug("LNK extra stuff at 0x%04x=%04x\n", i, len);
#endif
- i+=4;
- i+=len;
+ i+=4;
+ i+=len;
#ifdef DEBUG_LNK
- log_debug("LNK size %u (0x%04x)\n", i, i);
+ log_debug("LNK size %u (0x%04x)\n", i, i);
#endif
- reset_file_recovery(file_recovery_new);
- file_recovery_new->extension=file_hint_lnk.extension;
- file_recovery_new->calculated_file_size=i;
- file_recovery_new->data_check=&data_check_size;
- file_recovery_new->file_check=&file_check_size;
-// file_recovery_new->time=td_ntfs2utc(le64(lnk_head->ctime));
- return 1;
- }
- return 0;
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_lnk.extension;
+ file_recovery_new->calculated_file_size=i;
+ file_recovery_new->data_check=&data_check_size;
+ file_recovery_new->file_check=&file_check_size;
+ // file_recovery_new->time=td_ntfs2utc(le64(lnk_head->ctime));
+ return 1;
+}
+
+static void register_header_check_lnk(file_stat_t *file_stat)
+{
+ static const unsigned char lnk_header[20]= {
+ 'L', 0x00, 0x00, 0x00, /* magic */
+ 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 /* GUID */
+ };
+ register_header_check(0, lnk_header,sizeof(lnk_header), &header_check_lnk, file_stat);
}