Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static bool
- setup_stack (char *file_name,char **save_ptr, void **esp)
- {
- uint8_t *kpage;
- bool success = false;
- kpage = palloc_get_page (PAL_USER | PAL_ZERO);
- if (kpage != NULL)
- {
- success = install_page (((uint8_t *) PHYS_BASE) - PGSIZE, kpage, true);
- if (success)
- *esp = PHYS_BASE;
- else
- {
- palloc_free_page (kpage);
- return success;
- }
- }
- ////////////////////--------our implemention-------///////////////////////////////
- char *token;
- char ** argv = malloc(sizeof(char *) * 1);
- int i;
- int argc = 0;
- int sizeof_argv = 2;
- // push args to the stack
- for (token = file_name; token != NULL;
- token = strtok_r(NULL, " ", save_ptr))
- {
- *esp -= strlen (token) + 1;
- argv[argc] = *esp;
- argc ++;
- if (argc >= sizeof_argv)
- {
- sizeof_argv *= 2;
- argc = realloc (argv, sizeof_argv * sizeof(char *));
- }
- memcpy(*esp, token, strlen(token) + 1);
- }
- //null to the last parameter
- argv[argc] = 0;
- // algin to 4 bytes
- if ((size_t)*esp % 4)
- {
- *esp -= (size_t)*esp % 4;
- memcpy(*esp, &argv[argc], (size_t)*esp % 4);
- }
- memcpy(*esp, &argv[argc], sizeof(char*));
- // push address of args to the stack
- for (i = argc-1; i > 0 ; i++)
- {
- *esp -= sizeof (char *);
- memcpy (*esp, argv[i], sizeof(char *));
- }
- // push argv to the stack
- token = *esp;
- esp -= sizeof(char *);
- memcpy(*esp, &token, sizeof(char *));
- // push argc to the stack
- *esp -= sizeof(int);
- memcpy(*esp, &argc, sizeof(int));
- // push fake return address
- *esp -= sizeof(void *);
- memcpy(*esp, &argv[argc], sizeof(void *));
- free(argv);
- ////////////////////--------our implemention-------///////////////////////////////
- //hex_dump (0, *esp , 64 , true);
- return success;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement