How to alter a form base on the users' request info? I would like to customize a form base on the users' request info in a page callback. I use drupal_get_form (or node_add for node create form) to get the renderable array, but most changes to the array here have no effect.

I know that we usually use hook_form_alter, but it seems not suit here.

I would like to hide/set a field, change a field's title/options etc. based on the query parameters or page arguments. 

Do we have any methods to get the "raw describing form" and then modify and render it?
You should definitely use hook_form_alter() for that - no need to go a different route, it'll just make things harder for no benefit. Doing things the standard way your code could be as simple as:

function MYMODULE_form_alter(&amp;$form, &amp;$form_state, $form_id) {
  if ($form_id == 'foo_form' &amp;&amp; isset($_GET['bar'])) {
    $form['baz']['#access'] = FALSE;
  }
}